C++11 共享ptr参考计数器是如何布置的? 我对C++很陌生。我一直认为shared\u ptr将分隔指针保留在单独的引用计数器变量上。但是今天,我突然意识到我不知道它是如何排列的,并且引用值不需要在C++中有指针分离。 如果按标准定义布局,则正确的预期布局是: STD::SyrdYPPTR < /C> > /P> < P>,C++标准没有定义任何非标准布局类如何在内存中布置,例如[Me.MeM]/13

C++11 共享ptr参考计数器是如何布置的? 我对C++很陌生。我一直认为shared\u ptr将分隔指针保留在单独的引用计数器变量上。但是今天,我突然意识到我不知道它是如何排列的,并且引用值不需要在C++中有指针分离。 如果按标准定义布局,则正确的预期布局是: STD::SyrdYPPTR < /C> > /P> < P>,C++标准没有定义任何非标准布局类如何在内存中布置,例如[Me.MeM]/13 ,c++11,shared-ptr,memory-layout,C++11,Shared Ptr,Memory Layout,具有相同访问控制(第11条)的(非联合)类的非静态数据成员被分配,以便后面的成员在类对象中具有更高的地址。未指定具有不同访问控制的非静态数据成员的分配顺序(第11条)。实施一致性要求可能会导致两个相邻的成员不能紧随其后进行分配;管理虚拟函数(10.3)和虚拟基类(10.1)的空间需求也是如此 标准布局类型有一些例外/简化,但类的内存布局没有通用规范 这也适用于标准库中的类。除此之外,该标准仅定义了这些类的需求,其中一些类是成员函数签名意义上的“接口”。在[objects.within.class

具有相同访问控制(第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\u ptr
所需的功能,有一些注释:

  • 您需要将所拥有对象的引用计数存储在包含此所有权信息的动态分配对象中(dyn.alloc.因为不清楚哪个
    shared\u ptr
    是最后一个活动的,最后一个必须取消分配)
  • 您还需要存储此所有权信息对象的引用计数,以便使用
    弱ptr
    ,因为
    弱ptr::expired
    弱ptr::lock
    等可能不会失败(例如,通过访问冲突)
迂腐的旁白:该标准不要求
共享\u ptr
不泄漏内存,但PC型体系结构的典型实现可能会使用动态内存分配


std::make_shared
btw被认为比使用
std::shared_ptr
的ctor更快,因为它可以在一次分配中同时为所拥有的对象和所有权信息对象分配内存(标准规定“实现应执行最多一次内存分配”,尽管这只是一个备注).

该标准没有为大多数类定义“布局”(如所需的数据成员),
std::shared_ptr
就是其中之一。它只需要一个特定的行为,包括一些成员函数和非成员函数的存在。@DyP你能把它重写为一个答案吗?所以我可以选择它。除了公认的正确答案之外,这里还有一些ascii艺术,展示了典型的共享ptr布局:@HowardHinnant这正是我想要的。谢谢