42

如果空类的大小不能为 0,那么 std::tuple 有什么魔力,所以 unique_ptr 的 sizeof 在 64 位机器中返回 8?

在 unique_ptr 中,成员定义为:

  typedef std::tuple<typename _Pointer::type, _Dp>  __tuple_type;                 
  __tuple_type  _M_t;

其中 _Dp 是删除器类。

编译器是 gcc 版本 4.7.1 (Debian 4.7.1-7)

4

2 回答 2

62

原因是typename _Dp = default_delete<_Tp>是一个空类,tuple模板采用了空基类优化。

如果您unique_ptr使用非默认删除实例化 ,您应该会看到大小增加。

于 2012-11-19T19:23:26.177 回答
39

unique_ptr如指定的那样可以有零开销,因为实现它唯一需要的是修改复制/移动原始指针的过程;不需要额外的信息。因此unique_ptr除了指针之外不需要存储任何东西,并且可以与指针大小相同。

至于您的特定实施如何实现这一目标;只有大多数派生类型的大小才需要大于零。空基类可以占用零字节。从容器中的无状态分配器到元组,标准库实现利用所谓的“空基类”优化对各种事物进行优化是很常见的。

于 2012-11-19T19:21:59.863 回答