【问题标题】:How is alignment of objects and shared_ptrs calculated?如何计算对象和 shared_ptrs 的对齐方式?
【发布时间】: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


【解决方案1】:

这肯定是一个实现细节。

但是实际上只有两个选项,引用计数可以放在托管 T 对象之前或之后。

在任何情况下,我都会假设引用计数器将与其自然对齐对齐,因为有一个非自然对齐的整数会在某些平台上崩溃,并且在其他平台上会慢得多。

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2014-07-18
    • 2012-01-28
    相关资源
    最近更新 更多