我对C ++很陌生。我一直在shared_ptr
保持分离指针到单独的引用计数器变量。但是今天,我突然意识到实际上我不知道它是如何布局的,并且引用值不需要在C ++中有分离的指针。
如果布局是由标准定义的,那么std::shared_ptr
的预期布局是正确的吗?
答案 0 :(得分:2)
C ++标准没有为任何非标准布局类定义它应该如何在内存中布局,例如: [class.mem] / 13
分配具有相同访问控制(第11条)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。具有不同访问控制的非静态数据成员的分配顺序未指定(第11条)。实施对齐要求可能导致两个相邻成员不能立即分配;所以可能需要空间来管理虚函数(10.3)和虚基类(10.1)。
标准布局类型有一些例外/简化,但是类的内存布局没有通用规范。
这也适用于标准库中的类。除此之外,标准只定义了这些类的要求,其中一些是成员函数签名意义上的“接口”。非常明确地在[objects.within.classes]中:
1)第18至30条及附件D [即标准库]不指定类的表示,并故意省略类成员的规范(9.2)。实现可以根据需要定义静态或非静态类成员,或者两者,以实现第18至30条和附录D中指定的成员函数的语义。
2)某些类的对象有时需要其类的外部规范来存储数据,显然是在成员对象中。为了便于说明,一些子条款为符合类的外部规范的类的私有成员对象提供代表性声明和语义要求。此类成员对象的声明和相关成员类型的定义后跟一个仅以展示结束的注释,如:
streambuf* sb; // exposition only
那就是std::shared_ptr
所需功能的一些评论:
shared_ptr
是最后一个有效,而最后一个必须解除分配)weak_ptr
使用,weak_ptr::expired
和weak_ptr::lock
等可能失败 (例如,通过访问冲突) 迂腐旁注:标准不要求shared_ptr
不泄漏内存,但PC类型架构的典型实现可能会使用动态内存分配。< / em>的
std::make_shared
btw被认为比使用std::shared_ptr
的ctor更快,因为它可以在一次分配中为拥有对象和所有权信息对象分配内存(标准说“实现应该执行不超过一个内存分配。“,虽然这只是备注)。