如果需要存储删除器,unique_ptr如何没有开销?

scottxiao:

先来看看什么C ++入门谈到unique_ptrshared_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作为成员存储。真是一团糟!

Angew不再为SO感到骄傲:

std::unique_ptr<T>很有可能是零开销(使用任何理智的标准库实现)。std::unique_ptr<T, D>对于任意值D,通常不会产生零开销。

原因很简单:Empty-Base Optimization可用于消除删除器的存储,以防它是空的(因此是无状态的)类型(例如std::default_delete实例化)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果使用lambda,std :: unique_ptr如何没有大小开销

如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

unique_ptr删除程序的开销

没有op删除unique_ptr

带有 lambda 删除器的 Unique_ptr

unique_ptr 的有状态自定义删除器

没有unique_ptr的现代C ++构建器模式

如何使用删除器调用unique_ptr构造函数?

如何使用静态删除器创建 unique_ptr

没有std :: move的值如何返回unique_ptr?

如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

将具有自定义删除器的unique_ptr移到shared_ptr

使用自定义删除器在地图中存储unique_ptr

删除器类型在unique_ptr与shared_ptr中

具有自定义删除器的unique_ptr构造函数被删除

使用带有unique_ptr的自定义删除器

std :: unique_ptr使用带有很少参数的自定义删除器

无法使用带有std :: move的自定义删除器插入std :: unique_ptr

如何制作unique_ptr和自定义删除器的副本

如何将类的静态方法作为 std::unique_ptr 的删除器传递?

如何将非静态成员函数作为unique_ptr删除器传递

如何使用lambda和功能作为unique_ptr的自定义删除器

如何在C ++ 11中返回包含自定义删除器的std :: unique_ptr?

如何为由 unique_ptr 管理的数组编写自定义删除器?

如何将unique_ptr与更通用的删除器一起使用?

我需要返回具有unique_ptr成员的对象?

无法将带有NULL删除器的std :: unique_ptr移动到std :: shared_ptr?

删除函数unique_ptr

如果std :: function捕获了unique_ptr,该如何复制?