【问题标题】:Internal structure of a boost::smart_ptrboost::smart_ptr 的内部结构
【发布时间】:2014-04-16 23:21:45
【问题描述】:

我正在尝试确定boost(或std,如果更简单的话)shared_ptr 具有哪些数据成员原语/对象(在T* 指针之外),它们将在同一L1 缓存行中T*指针,当shared_ptr用于访问底层堆内存?

当我这样做时:

sizeof(boost::shared_ptr<int>)

sizeof(boost::shared_ptr<double>)

我得到了相同的答案——8 个字节,但在我的系统上,一个 int 是 4 个字节,一个 double 是 8 个字节?

我查看了shared_ptr的boost源代码:

http://www.boost.org/doc/libs/1_55_0/libs/smart_ptr/shared_ptr.htm

但我什至看不到 T* 数据成员....所以我不太确定 boost::shared_ptr 在数据成员方面的外观?

【问题讨论】:

  • 您显示的链接是概要,而不是真正的代码,因此它不显示内部结构。实际代码可以看这里:boost.org/doc/libs/1_55_0/boost/smart_ptr/shared_ptr.hpp,两个成员分别是element_type * px;boost::detail::shared_count pn;
  • 在 64 位系统上,指针大小应该始终 (?) 为 8 字节,无论它指向什么(除非它指向一个数组,然后 sizeof 返回类型时间的大小数组的长度。double 是 IEEE 754 定义的 8 个字节。int 通常是 4 个字节长,要获得 64 位整数类型,您可以使用 long long 或来自 &lt;cstdint&gt;std::int64_t
  • 一般来说,参考已经在你机器上的 boost 源而不是 www.boost.org 上的网页可能更有效(标题肯定会在那里,源任何 lib 文件都可能没有,但这些文件只占提升的一小部分)。

标签: c++ boost shared-ptr


【解决方案1】:

boost::shared_ptr&lt;&gt; 包含两个指针,一个指向对象本身,一个指向用于引用计数、正确销毁等的跟踪器对象。这意味着它将是 2 * sizeof(void*) 大。

tracker 对象的结构当然是一个实现细节,但它有几十个字节大(虚拟表、指向对象的指针、引用计数、弱计数和一些额外的标志等等)。

如果您按照推荐使用boost::make_shared(),则对象本身和保存对象的信息都将在一个堆块中创建,并且指针将仅相隔几个字节。

【讨论】:

  • 那么sizeof(boost::shared_ptr&lt;whatever&gt;) 不会返回 16,因为 64 位系统上的原始指针应该是 8 个字节长?
  • @MoreAxes:这取决于它是如何编译的。显然它被编译为 32 位。
  • 你是对的。不幸的是,我没有看到任何关于 OP 架构的概念,但从报告的大小 8 来看,我认为它是 32 位的。
猜你喜欢
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2011-06-13
  • 2012-12-12
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多