gpt4 book ai didi

c++ - 分配器如何与 std::vector 一起工作?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:28 26 4
gpt4 key购买 nike

我正在查看 vector::vector 的文档在 cppreference 上,作为练习,我试图弄清楚我将如何实现 explicit vector( const Allocator& alloc ) noexcept;

我问自己的问题是,为什么要将分配器传递给 vector ?只有分配器是多态的才有意义。但是,如果那组分配器具有不同的状态信息,即具有不同的大小,则会导致以下问题:

  1. 你不能只将分配器作为成员/基类,因为你会导致对象在复制时被切片。
  2. 如果您没有它作为成员,则必须分配它。分配意味着它可能会导致异常。

那么,鉴于这些原因,这是否意味着分配器组必须仅在基类中具有状态?还有什么我想念的吗?

最佳答案

If you don't have it as a member, it would have to be allocated. Allocation implies that it can cause an exception.

不,它不必分配。要构造 std::vector 的实例,只需复制构造即可。

分配器实例作为 const 引用传递给 std::vector 的构造函数。 std::vector 本身有一个 Allocator 实例作为(私有(private))类成员,它是从该参数复制构造的。

请记住,Allocator 是第二个(默认)std::vector 模板参数。因此,典型的实现将 Allocator 声明为 std::vector 本身的(私有(private))成员,因此唯一发生的分配是 std 的分配: :vector 本身。

std::vector 的默认构造函数默认构造它的 Allocator 类成员,它也是 noexcept(C++ 17).

所以胶囊总结是分配器类(从 C++17 开始)必须有一个 noexcept 复制构造函数和一个 noexcept 默认构造函数,它命令满足std::vector本身的noexcept异常要求。

在构造 std::vector 实例的过程中,不需要额外分配(对于不初始化 内容的构造函数>std::vector 作为其构造的一部分)—— std::vector 本身的分配除外。

关于c++ - 分配器如何与 std::vector 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408908/

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