先来看看什么C ++入门谈到unique_ptr
和shared_ptr
:
$ 16.1.6。效率和灵活性
我们可以确定
shared_ptr
不会将删除程序保留为直接成员,因为直到运行时才知道删除程序的类型。因为删除器的类型是a
unique_ptr
的类型的一部分,所以删除器成员的类型在编译时是已知的。删除程序可以直接存储在每个unique_ptr
对象中。
因此,似乎shared_ptr
没有deleter的直接成员,但是unique_ptr
有。但是,另一个问题最受好评的答案是:
如果提供deleteer作为模板参数(如
unique_ptr
),则它是该类型的一部分,并且不需要在此类型的对象中存储任何其他内容。如果将deleter作为构造函数的参数传递(如shared_ptr
),则需要将其存储在object中。这是额外灵活性的代价,因为您可以对相同类型的对象使用不同的删除器。
引用的两个段落完全矛盾,这使我感到困惑。而且,许多人说unique_ptr
开销为零,因为它不需要将删除程序存储为成员。但是,正如我们所知,unique_ptr
具有的构造函数unique_ptr<obj,del> p(new obj,fcn)
,这意味着我们可以将deleter传递给它,因此unique_ptr
似乎已将deleter作为成员存储。真是一团糟!
std::unique_ptr<T>
很有可能是零开销(使用任何理智的标准库实现)。std::unique_ptr<T, D>
对于任意值D
,通常不会产生零开销。
原因很简单:Empty-Base Optimization可用于消除删除器的存储,以防它是空的(因此是无状态的)类型(例如std::default_delete
实例化)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句