auto_ptr的大小是多少?

时间:2015-03-16 17:14:07

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

auto_ptr是否与指针大小相同?

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

1 个答案:

答案 0 :(得分:2)

通过简单地执行此操作,您可以很容易地找出尺寸:

#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个指针:一个是指向所讨论对象的(可能是别名)指针,一个是指向引用计数共享数据结构的指针其关联的共享或弱指针使用。共享指针可以指向除了实际由引用计数管理的内容之外的事实(或者一些相关但不同的指针,如指向成员或基类/派生类的指针),这就是它需要的原因除了指向引用计数共享数据的指针之外的本地指针(并且,当可以直接获得指向对象的指针时,它也执行得更好,而不必通过共享数据结构)。但是当你需要引用计数时,这仍然是一个合理的开销。