我正在观看Jonathan Blow的视频Ideas about a new programming language for games,其中他讨论了他称之为“联合分配”的游戏编程中的常见模式。这个想法是当你有一个类有几个动态分配数组的成员(可能是std::vector
,但因为它们是固定大小,更像是建议的std::dynarray
)你预先分配了足够的内存存储所有数组数据,只执行一个足够大的分配给所有数组,而不是每个数组一个。
他建议对这种模式提供直接语言支持,让我想知道C ++标准是否允许实现以这种方式合并分配?令我感到震惊的是,这需要编译器的一些英雄努力才能真正实现优化,但我不明白为什么它原则上无法完成的明显原因。有没有人知道这是不是在标准下是不允许的,或者即使已经有实施在实践中进行这种优化?
答案 0 :(得分:10)
是的,该标准允许合并分配(C ++ 14):
5.3.4新
[expr.new]
10允许实现省略对可替换全局分配函数的调用(18.6.1.1,18.6.1.2)。 当它这样做时,存储由实现提供或通过扩展提供 分配另一个 new-expression 。实现可以扩展 new-expression
e1
的分配 为 new-expressione2
提供存储,如果以下情况属实,则分配未扩展:
- 在评估
之前,对e1
和e2
的评估进行了排序 只要e1获得存储,就会评估e2
,e1
和e2
都会调用相同的可替换全局分配函数,- 如果
e1
和e2
调用的分配函数抛出,则评估中抛出的任何异常e1
或e2
中的任何一个将首先在同一个处理程序中捕获,并且e1
和e2
生成的指针值是评估 delete-expressions 的操作数,- 在评估 delete-expression 之前对
e2
的评估进行了排序,其操作数是e1
生成的指针值。
C ++ 11不允许合并或省略此类分配。