C++ std::unique\u ptr如何没有大小开销?

C++ std::unique\u ptr如何没有大小开销?,c++,c++11,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; typedef std::tuple\uu tuple\u type; __元组类型; 其中_Dp是de

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

在unique_ptr中,成员定义为:

  typedef std::tuple<typename _Pointer::type, _Dp>  __tuple_type;                 
  __tuple_type  _M_t;
typedef std::tuple\uu tuple\u type;
__元组类型;
其中_Dp是deleter类


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

unique\u ptr
指定的编译器可以没有开销,因为实现它唯一需要的是修改复制/移动原始指针的过程;不需要额外的信息。因此,
unique_ptr
不需要存储指针以外的任何内容,并且可以与指针大小相同


关于您的具体实施如何实现这一点;只有大多数派生类型的大小需要大于零。空基类可能占用零字节。对于标准库实现来说,利用所谓的“空基类”优化实现各种功能是很常见的,从容器中的无状态分配器到元组。

原因是
typename\u Dp=default\u delete
是一个空类,
tuple
模板采用空基类优化


如果您使用非默认的delete实例化
unique\u ptr
,您应该会看到大小增加。

这也可能取决于实现,因此您可能还需要包括您正在讨论的编译器。我不确定
std::tuple
std::unique\u ptr
之间的关系。你能澄清一下吗?@Cameron,_M_t是unique_ptr上的基本类型。感谢你的回答,投票+1我接受了chill,因为他分数较低,并且提供了一个有效的答案。换一句话:当类自身实例化时,必须具有非零大小,但当作为基类安装时,允许大小为零。这不是真的:我用自己定义的deleter实例化,得到了一个指针大小的
unique\u ptr
。它所需要的只是删除器的“自然大小”为零。