【发布时间】:2021-06-22 06:03:12
【问题描述】:
在a talk from 2015Andrei Alexandrescu 中概述了 std::allocator 接口的一些暴行,简短地强调了它实际上与分配无关,并提出了一种不同的思考方式来考虑这些分配器,这将使它们更加可用和模块化。或者,引用描述:
std::allocator 有着不光彩的过去、阴暗的现在和无趣的未来。 STL 引入分配器作为 1990 年代现已过时的分段内存模型的权宜之计。他们的设计是有限的,并且在很多方面甚至都没有旨在帮助分配那么多。因为分配者在那里,他们只是继续在那里,直到他们变得无法根除或工作,尽管社区付出了英勇的努力。
本演讲讨论了根据第一原则创建的内存分配器的完整设计。它是通用的、组件化的和可组合的,用于支持特定于应用程序的分配模式。
他针对当前 std::allocator 的主要观点包含在视频的this section 中,但总结一下:
- 分配器不应该关心被分配的类型,只关心大小和对齐方式。
- 分配器不应负责存储有关分配的大小信息,分配和解除分配应对称(分别)返回并接收
Blk(ptr,大小)。 -
Rebind<U>::other太可怕了(他没有说得更详细) - 分配器不应该是无状态的(因为它们确实给了你一些内存,它们怎么可能是无状态的?)
- 分配器应该围绕组合的概念来定义;如果您查看现实世界的分配器,它们都是由有条件运行的小型分配器组成的。
自从我看了那场演讲后,我就一直期待着能从中得到一些建议,因为这个想法看起来非常合理和实用。过去我不得不使用 std::allocator,当我的屏幕在候选函数不可行中向我尖叫时,它让我第一次理解了对 C++20 概念的需求。
但似乎没有任何东西来自它?那时我不在,但似乎 STL2 正在开发中,但后来已经停产了。是否已在某处确定概念足以至少调解 std::allocator 的症状(如果是,在哪里/何时?)还是向后兼容问题?未来 C++ 版本的路线图是否与此相关?
【问题讨论】:
-
您能否详细说明实际上与分配无关以及您希望它是什么样的?
-
将它包含在 STL 中的最初原因显然是为了处理近/远指针的问题:谈话的this section 强调了 std::allocator 的主要问题,其余的它概述了一个新的设计。他基本上建议使用小型可组合的预定义分配器,例如“segrator”、“stackallocator”、“nullallocator”、“fallbackallocator”,并使用组合来为某个应用程序构建一个复杂的自定义分配器。
-
其实this section 稍晚一点总结的比较好。
-
我不想看冗长的演示文稿。能否总结一下当前分配器接口存在的问题?
-
@SergeBallesta 我用简短的摘要更新了这个问题。不过,我确实建议您观看它,对我来说,它非常有见地!
标签: c++ c++20 allocator c++-concepts c++23