先看看C++ Primer讲了什么unique_ptr
and shared_ptr
:
16.1.6 美元。效率和灵活性
我们可以确定的是shared_ptr
不将删除者视为直接成员,因为删除器的类型直到运行时才知道。
因为删除器的类型是a类型的一部分unique_ptr
,删除器成员的类型在编译时已知。删除器可以直接存储在每个unique_ptr
object.
所以看来shared_ptr
没有删除器的直接成员,但是unique_ptr
做。然而,另一个问题的得票最高的答案 https://stackoverflow.com/questions/21355037/why-does-unique-ptr-take-two-template-parameters-when-shared-ptr-only-takes-one says:
如果您提供删除器作为模板参数(如unique_ptr
)它是类型的一部分,你不需要在该类型的对象中存储任何额外的内容。如果删除器作为构造函数的参数传递(如shared_ptr
) 你需要将它存储在对象中。这是额外灵活性的代价,因为您可以对同一类型的对象使用不同的删除器。
引用的两个段落完全矛盾,这让我很困惑。更重要的是,很多人说unique_ptr零开销 https://stackoverflow.com/questions/13460395/how-can-stdunique-ptr-have-no-size-overhead因为它不需要将删除者存储为成员。然而,据我们所知,unique_ptr
有一个构造函数unique_ptr<obj,del> p(new obj,fcn)
,这意味着我们可以向它传递一个删除器,所以unique_ptr
似乎已将删除器存储为成员。真是一团糟!
std::unique_ptr<T>
很可能是零开销(使用任何合理的标准库实现)。std::unique_ptr<T, D>
,对于任意的D
,通常不是零开销。
原因很简单:空基优化可用于消除删除器的存储,以防它是空(因此无状态)类型(例如std::default_delete
实例化)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)