auto_ptr 的大小是多少?
What is the size of an auto_ptr?
auto_ptr
是否与指针具有相同的大小?
我必须用 boost::scoped_ptr
代替它,我想知道这两种数据类型是否具有相同的大小。
只需执行以下操作,您就可以很容易地找出尺寸:
#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 提供该保证,但它们确实提供了以下声明:
Because scoped_ptr is simple, in its usual implementation every operation is as fast as for a built-in pointer and it has no more space overhead that a built-in pointer.
我会说,可以很安全地假设上述陈述适用于任何体面的 auto-ptr、unique-ptr 或 scoped-ptr 实现。如果你在某个平台上测试它并得到一个收缩的结果,那么我会认为该实现是毫无价值的无用垃圾。这些智能指针中的任何一个都没有合理的理由包含任何超过单个指针的东西(unique-ptr 除外,它可能必须为非空的自定义删除器对象腾出空间,但除此之外,它的大小应该与另外两个)。
顺便说一句,如果您也对为什么 shared-ptr 在我的测试中的大小为 16 感到好奇。这是因为 shared-ptr 的特性使得单个共享指针必须包含 2 个指针:一个是指向相关对象的(可能是别名的)指针,一个是指向所有引用计数共享数据结构的指针其关联的共享或弱指针使用。共享指针可以指向除引用计数实际管理的内容之外的其他内容(或一些相关但不同的指针,如指向成员或基类/派生类 class 的指针)这一事实是除了指向引用计数共享数据的指针之外,它还需要该本地指针的原因(而且,当可以直接获取指向对象的指针时,它的性能也更好,而不必通过共享数据结构)。但是当你需要引用计数时,这仍然是一个合理的开销。
auto_ptr
是否与指针具有相同的大小?
我必须用 boost::scoped_ptr
代替它,我想知道这两种数据类型是否具有相同的大小。
只需执行以下操作,您就可以很容易地找出尺寸:
#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 提供该保证,但它们确实提供了以下声明:
Because scoped_ptr is simple, in its usual implementation every operation is as fast as for a built-in pointer and it has no more space overhead that a built-in pointer.
我会说,可以很安全地假设上述陈述适用于任何体面的 auto-ptr、unique-ptr 或 scoped-ptr 实现。如果你在某个平台上测试它并得到一个收缩的结果,那么我会认为该实现是毫无价值的无用垃圾。这些智能指针中的任何一个都没有合理的理由包含任何超过单个指针的东西(unique-ptr 除外,它可能必须为非空的自定义删除器对象腾出空间,但除此之外,它的大小应该与另外两个)。
顺便说一句,如果您也对为什么 shared-ptr 在我的测试中的大小为 16 感到好奇。这是因为 shared-ptr 的特性使得单个共享指针必须包含 2 个指针:一个是指向相关对象的(可能是别名的)指针,一个是指向所有引用计数共享数据结构的指针其关联的共享或弱指针使用。共享指针可以指向除引用计数实际管理的内容之外的其他内容(或一些相关但不同的指针,如指向成员或基类/派生类 class 的指针)这一事实是除了指向引用计数共享数据的指针之外,它还需要该本地指针的原因(而且,当可以直接获取指向对象的指针时,它的性能也更好,而不必通过共享数据结构)。但是当你需要引用计数时,这仍然是一个合理的开销。