分配器如何与std :: vector一起使用?

时间:2019-03-29 00:39:30

标签: c++ c++17

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

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

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

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

1 个答案:

答案 0 :(得分:2)

  

如果您没有它作为成员,则必须对其进行分配。   分配意味着它可能导致异常。

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

分配器实例作为对const的构造函数的std::vector引用被传递。 std::vector本身有一个Allocator实例作为(私有)类成员,并且它是使用此参数复制构造的。

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

std::vector的默认构造函数default构造其Allocator类成员,该成员也是noexcept(从C ++ 17开始)。

因此,胶囊摘要是分配器类(从C ++ 17开始)必须具有一个noexcept复制构造函数和一个noexcept默认构造函数,才能满足{{1} } noexcept本身的例外要求。

在构造std::vector实例的过程中,不需要 additional 分配(对于不将std::vector的内容初始化为其结构)-除了std::vector本身的分配。