3

2015 年的一次演讲中, Andrei Alexandrescu 概述了 std::allocator 接口的一些暴行,简短地强调了它实际上与分配无关,并提出了一种不同的思考方式来思考这些分配器,这将使它们更加可用和模块化。或者,引用描述:

std::allocator 有着不光彩的过去、阴暗的现在和无趣的未来。STL 引入分配器作为 1990 年代现在过时的分段内存模型的权宜之计。他们的设计是有限的,并且在很多方面甚至没有旨在帮助分配那么多。因为分配者在那里,他们只是继续在那里,直到他们变得不可能连根拔起或工作,尽管社区付出了英勇的努力。

本演讲讨论了从第一原理创建的内存分配器的完整设计。它是通用的、组件化的和可组合的,用于支持特定于应用程序的分配模式。

他针对当前 std::allocator 的主要观点包含在视频的这一部分中,但总结一下:

  1. 分配器不应该关心被分配的类型,只关心大小和对齐方式。
  2. 分配器不应该负责存储有关分配的大小信息,分配和释放应该对称地(分别)返回和接收Blk(ptr,大小)。
  3. Rebind<U>::other很糟糕(他没有进一步详细说明)
  4. 分配器不应该是无状态的(因为它们实际上给了你一些内存,它们怎么可能是无状态的?)
  5. 分配器应该围绕组合的概念来定义;如果您查看现实世界的分配器,它们都由有条件运行的小型分配器组成。

自从我看了那场演讲后,我就期待着会从中得到某种建议,因为这个想法看起来非常合理和实用。过去我不得不使用 std::allocator ,当我的屏幕在候选函数不可行时向我尖叫时,它让我第一次理解了对 C++20 概念的需求。

但似乎没有任何东西来自它?那时我不在,但似乎 STL2 正在开发中,但后来已经停产了。是否已在某处确定概念足以至少调解 std::allocator 的症状(如果是,在哪里/何时?)还是向后兼容问题?未来 C++ 版本的路线图是否与此相关?

4

2 回答 2

3

没有提议彻底改变分配器模型。这基本上有两个原因。

C++ 容器库依赖于以某种方式工作的分配器,并且使容器能够与这两种分配器一起工作会非常复杂。因此,如果你想要一个新的分配器模型,你也在谈论一组新的容器,这是委员会不愿打开的一大罐蠕虫。

如今,分配器创建和使用方面的大多数缺陷都是可以避免的。即使在 C++17 中编写分配器也不是什么挑战。您无需了解事物的血腥细节;你只需要实现几个函数和几个成员别名。std::allocator_traits为您填补了大部分空白。

归根结底,C++ 语言和库中存在重大缺陷,这些缺陷比分配器模型更重要,分配器模型比严格必要的更难使用。

于 2021-03-25T13:34:31.147 回答
0

我们已经std::pmr建立在分配器之上,可以解决所有列出的问题。

于 2021-11-15T17:11:45.983 回答