【问题标题】:What is the size of an auto_ptr?auto_ptr 的大小是多少?
【发布时间】:2015-03-16 17:14:07
【问题描述】:

auto_ptr 的大小是否与指针相同?

我必须用boost::scoped_ptr 替换它,我想知道这两种数据类型是否具有相同的大小。

【问题讨论】:

  • 你为什么不直接打印 sizeof 呢? PS。它不仅仅是一个指针,因为它需要一个引用计数器
  • "我想知道这两种数据类型是否具有相同的大小。" – 为什么需要此信息才能将其更改为 boost::scoped_ptr
  • @texasbruce:auto_ptrscoped_ptr 都不是引用计数的。 shared_ptr 是,但必须将引用计数存储在单独的共享数据结构中,而不是指针对象本身。它们中的任何一个都不需要包含多个指针。
  • @MikeSeymour shared_ptr 实际上通常包含两个指针 - 一个指向引用计数块,一个指向 get() 的返回值,它可以与它管理的生命周期完全无关。
  • 为什么我们还在谈论auto_ptrstd::unique_ptr更好,搜索销毁auto_ptr

标签: c++ pointers smart-pointers auto-ptr


【解决方案1】:

您只需执行以下操作即可轻松找出尺寸:

#include <iostream>
#include <memory>

#include <boost/shared_ptr.hpp>
#include <boost/scoped_ptr.hpp>

int main() {
  std::cout << "raw pointer: " << sizeof(int*) << std::endl;
  std::cout << "auto-ptr: " << sizeof(std::auto_ptr<int>) << std::endl;
  std::cout << "unique-ptr: " << sizeof(std::unique_ptr<int>) << std::endl;
  std::cout << "shared-ptr: " << sizeof(std::shared_ptr<int>) << std::endl;
  std::cout << "boost scoped-ptr: " << sizeof(boost::scoped_ptr<int>) << std::endl;
  std::cout << "boost shared-ptr: " << sizeof(boost::shared_ptr<int>) << std::endl;
  return 0;
};

在我的平台(64 位)上,使用 GCC 4.8.2 和 Boost 1.55,我得到以下输出:

raw pointer: 8
auto-ptr: 8
unique-ptr: 8
shared-ptr: 16
boost scoped-ptr: 8
boost shared-ptr: 16

当然,不能严格保证这些结果在任何地方都是相同的。换句话说,该标准不要求 auto-ptr 或 unique-ptr (C++11) 与常规(原始)指针的大小相同。据我所知,Boost 文档也没有明确地为 scoped-ptr 提供这种保证,但他们确实给出了以下声明:

因为 scoped_ptr 很简单,在其通常的实现中,每个操作都与内置指针一样快,并且它没有内置指针更多的空间开销。

我会说,假设上述陈述适用于任何体面的 auto-ptr、unique-ptr 或 scoped-ptr 实现是非常安全的。如果您在某个平台上对其进行测试并获得与该协议相关的结果,那么我会认为该实现是毫无价值的不可用垃圾。这些智能指针中的任何一个都没有任何合理的理由包含一个指针以外的任何内容(除了 unique-ptr 可能必须为非空自定义删除器对象腾出位置,但除此之外,应该具有相同的大小另外两个)。

顺便说一句,如果你也好奇为什么 shared-ptr 在我的测试中大小为 16。这是因为 shared-ptr 的特性使得单个共享指针必须包含 2 个指针:一个是指向相关对象的(可能是别名)指针,一个是指向所有引用计数的共享数据结构的指针其关联的共享指针或弱指针使用。事实上,共享指针可以指向引用计数实际管理的内容(或一些相关但不同的指针,如指向成员或基类/派生类的指针)之外的东西,这是它需要的原因除了指向引用计数共享数据的指针之外的本地指针(而且,当可以直接获得指向对象的指针时,它也表现得更好,而不必通过共享数据结构)。但是,当您需要引用计数时,这仍然是一个合理的开销。

【讨论】:

  • 很好的答案。但是没有人提到sizeof() 不包括任何额外的开销。 shared_ptr 的典型实现分配一个指向“拥有”对象的指针和一个指向“控制块”的指针。该控制块包括强引用计数、删除器副本和弱引用计数。 shared_ptr 的内存通常超过 2 个指针(通常为 16 个字节)。这些考虑都不适用于auto_ptr 的任何合理实现。
猜你喜欢
  • 2021-09-22
  • 1970-01-01
  • 2013-02-26
  • 2012-06-30
  • 2011-03-13
  • 1970-01-01
  • 2011-10-08
  • 2012-04-08
  • 2012-11-10
相关资源
最近更新 更多