C++ std::unique\u ptr如何没有大小开销?
如果一个空类的大小不能为0,那么std::tuple的神奇之处是什么,使得unique_ptr的sizeof在64位机器中返回8 在unique_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
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
。它所需要的只是删除器的“自然大小”为零。