【问题标题】:How can std::unique_ptr have no size overhead?std::unique_ptr 如何没有大小开销?
【发布时间】:2012-11-19 19:06:01
【问题描述】:

如果空类的大小不能为 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)

【问题讨论】:

  • 这也可能与实现有关,因此您可能还需要包含您正在谈论的编译器。
  • 我不确定std::tuple 与您的问题中的std::unique_ptr 有何关系。你能澄清一下吗?
  • @Cameron,_M_t 是 unique_ptr 上的基础类型。

标签: c++ c++11


【解决方案1】:

原因是typename _Dp = default_delete&lt;_Tp&gt;是一个空类,而tuple模板采用了空基类优化。

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

【讨论】:

  • 换个说法:当一个类被自己实例化时,它的大小必须非零,但当作为基类实例化时,它的大小是允许的。
  • 不是真的:我用我自己定义的删除器实例化,并得到一个指针大小的unique_ptr。它所需要的只是删除器的“自然大小”为零。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的回答,投票 +1 我接受了寒冷,因为他的分数较低并且还提供了有效的答案。
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 2017-12-18
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2014-03-05
  • 2015-04-28
相关资源
最近更新 更多