std :: unique_ptr怎么没有大小开销?

pio*_*otr 36 c++ c++11

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

在unique_ptr中,成员定义为:

  typedef std::tuple<typename _Pointer::type, _Dp>  __tuple_type;                 
  __tuple_type  _M_t;
Run Code Online (Sandbox Code Playgroud)

其中_Dp是删除类.

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

chi*_*ill 53

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

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

  • 稍微改写一下:当它自己实例化时,类必须具有非零大小,但是当作为基类实例化时,允许零大小. (12认同)
  • 不是真的:我用我自己定义的删除器实例化,并得到了一个指针大小的 `unique_ptr`。它所需要的只是删除器的“自然大小”为零。 (3认同)

bam*_*s53 33

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

至于你的具体实施方式,实现了这一点; 只有大多数派生类型的大小必须大于零.空基类可占用零字节.标准库实现通常利用所谓的"空基类"优化来处理所有类型的事情,从容器中的无状态分配器到元组.