gpt4 book ai didi

c++ - std::unique_ptr 包括删除器作为类型的一部分有什么好处

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:08:15 25 4
gpt4 key购买 nike

为什么 std::unique_ptr 包含删除函数签名作为模板定义的一部分?

template<class T, class Deleter = std::default_delete<T>> class unique_ptr;

对比

template< class T > class shared_ptr;

最佳答案

unique_ptr 的总体目标是在唯一指针超出范围时自动删除指针。使用默认删除器时(只需调用 delete),unique_ptr 对象中不需要任何额外的数据成员,指针本身除外。这意味着默认情况下,unique_ptr 几乎没有任何开销(因为它的大部分(即使不是全部)函数都将被内联)。

但他们还希望能够提供更改删除器的选项,以便在有意义的特殊情况下使用。提供该选项的唯一方法,同时仍然能够优化它(存储和内联调用)是使它成为类型本身的静态部分,即通过模板参数。重点是 unique_ptr 旨在成为原始指针的最小开销替代方案。

shared_ptr 的情况下,目标是完全不同的,现有的开销也是如此。共享指针实际上使用共享存储(动态分配),它存储指针、引用计数和删除对象。换句话说,已经存在显着的开销和放置删除器对象的适当位置,而不会导致额外的每个指针开销。此外,与所有引用计数机制相比,虚拟调用(执行删除)的开销与现有开销相比显得苍白无力。这就是为什么在共享指针中包含类型删除删除器对象这一便利功能是自然而然的选择。

而且,如果您想创建一个具有类型删除删除器的唯一指针类型,使用模板别名非常简单:

template <typename T>
using any_unique_ptr = std::unique_ptr< T, std::function< void(T*) > >;

或者类似的东西,比如这个删除器:

template <typename T>
struct type_erased_delete {
std::function< void(T*) > f;

type_erased_delete() : f(std::default_delete<T>()) { };

template <typename Func>
type_erased_delete(Func&& aF) : f(std::forward<Func>(aF)) { };

void operator()(T* p) const { f(p); };
};

template <typename T>
using any_unique_ptr = std::unique_ptr< T, type_erased_delete<T> >;

关于c++ - std::unique_ptr 包括删除器作为类型的一部分有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23065769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com