【发布时间】:2014-06-05 21:40:17
【问题描述】:
假设我有一个由共享指针管理的对象:shared_ptr<X>。假设我的X 类有 98 个字节大,最后一个数据成员位于字节 97-98(一个字符)。
一般来说,共享 ptr 包含一个指向我的 X 对象的原始指针和一个指向引用计数对象的原始指针,该对象包含两个计数器(一个强引用计数器和一个弱引用计数器)。
引用计数对象将从哪个地址开始(即两个引用计数的位置)?它会在我的X 类的第 98 个字节结束之后立即出现吗?或者会有一个特定的数字对齐方式,比如 32 字节对齐,它会在第 128 个字节处?一般由什么决定位置?
假设make_shared已被使用。
【问题讨论】:
-
嗯?共享指针(及其成员)与对象本身不同。一般来说,它们的内存位置是不相关的
-
@OliCharlesworth 不按此:lanzkron.wordpress.com/2012/04/22/…
-
"另一方面,当使用 make_shared 时,跟踪对象和引用计数可以一起分配。"也请看第二张图。
-
有趣。所以 make_shared 有一些魔力。然而,为什么内部实现细节的一致性很重要?
-
Looking at libstdc++,似乎他们使用
_Sp_counted_base和两个_Atomic_word作为引用计数器作为_Sp_counted_ptr_inplace的基类,它有一个嵌套类_Impl的数据成员,它使用一个__gnu_cxx::__aligned_buffer<_Tp>。所以内存布局大概是这样的:vptr、强计数、弱计数、对齐缓冲区(假设空分配器和默认删除器)。
标签: c++ shared-ptr make-shared