在2015 年的一次演讲中, Andrei Alexandrescu 概述了 std::allocator 接口的一些暴行,简短地强调了它实际上与分配无关,并提出了一种不同的思考方式来思考这些分配器,这将使它们更加可用和模块化。或者,引用描述:
std::allocator 有着不光彩的过去、阴暗的现在和无趣的未来。STL 引入分配器作为 1990 年代现在过时的分段内存模型的权宜之计。他们的设计是有限的,并且在很多方面甚至没有旨在帮助分配那么多。因为分配者在那里,他们只是继续在那里,直到他们变得不可能连根拔起或工作,尽管社区付出了英勇的努力。
本演讲讨论了从第一原理创建的内存分配器的完整设计。它是通用的、组件化的和可组合的,用于支持特定于应用程序的分配模式。
他针对当前 std::allocator 的主要观点包含在视频的这一部分中,但总结一下:
- 分配器不应该关心被分配的类型,只关心大小和对齐方式。
- 分配器不应该负责存储有关分配的大小信息,分配和释放应该对称地(分别)返回和接收
Blk
(ptr,大小)。 Rebind<U>::other
很糟糕(他没有进一步详细说明)- 分配器不应该是无状态的(因为它们实际上给了你一些内存,它们怎么可能是无状态的?)
- 分配器应该围绕组合的概念来定义;如果您查看现实世界的分配器,它们都由有条件运行的小型分配器组成。
自从我看了那场演讲后,我就期待着会从中得到某种建议,因为这个想法看起来非常合理和实用。过去我不得不使用 std::allocator ,当我的屏幕在候选函数不可行时向我尖叫时,它让我第一次理解了对 C++20 概念的需求。
但似乎没有任何东西来自它?那时我不在,但似乎 STL2 正在开发中,但后来已经停产了。是否已在某处确定概念足以至少调解 std::allocator 的症状(如果是,在哪里/何时?)还是向后兼容问题?未来 C++ 版本的路线图是否与此相关?