shared_ptr参考计数器如何布局?

时间:2013-07-13 05:35:37

标签: c++11 shared-ptr memory-layout

我对C ++很陌生。我一直在shared_ptr保持分离指针到单独的引用计数器变量。但是今天,我突然意识到实际上我不知道它是如何布局的,并且引用值不需要在C ++中有分离的指针。

如果布局是由标准定义的,那么std::shared_ptr的预期布局是正确的吗?

1 个答案:

答案 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所需功能的一些评论:

  • 您需要将拥有对象的引用计数存储在一个动态分配的对象中,该对象包含此所有权信息(dyn.add。因为不清楚哪个shared_ptr是最后一个有效,而最后一个必须解除分配)
  • 您还需要存储此所有权信息对象的引用计数以供weak_ptr使用,weak_ptr::expiredweak_ptr::lock等可能失败 (例如,通过访问冲突)

迂腐旁注:标准不要求shared_ptr 泄漏内存,但PC类型架构的典型实现可能会使用动态内存分配。< / em>的

std::make_shared btw被认为比使用std::shared_ptr的ctor更快,因为它可以在一次分配中为拥有对象和所有权信息对象分配内存(标准说“实现应该执行不超过一个内存分配。“,虽然这只是备注)。