C++标准是否允许实现合并分配?

mat*_*ort 5 c++ c++11 c++14

我正在观看Jonathan Blow 关于游戏新编程语言的视频,其中他讨论了游戏编程中他称之为"联合分配"的常见模式.这个想法是当你有一个具有动态分配数组的成员的类时(可能std::vector因为它们是固定大小,更像是建议的std::dynarray)你预分配足够的内存来存储所有数组数据并只执行一次分配所有数组都足够大,而不是每个数组都有一个数组.

他建议对这种模式提供直接语言支持,让我想知道C++标准是否允许实现以这种方式合并分配?令我感到震惊的是,这需要编译器的一些英雄努力才能实际实现为优化,但我没有看到原因无法完成的明显原因.有谁知道在标准下是否允许这样做,或者即使已经有实现在实践中进行这种优化的实现?

Ded*_*tor 10

是的,该标准允许合并分配(C++ 14):

5.3.4新的 [expr.new]

10允许实现省略对可替换全局分配函数的调用(18.6.1.1,18.6.1.2).当它这样做时,存储由实现提供,或者通过扩展另一个新表达式的分配来提供.该实现可以扩展的分配新表达 e1 一种用于提供存储新表达 e2如果分别分配不延伸下面将是真实的:

  • 在评估e1之前对评估进行测序e2,并且
  • e2 每当e1获得存储时评估,并且
  • 两者e1e2调用相同的可替换全局分配函数,和
  • 如果由e1和调用的分配函数e2抛出,则在评估中抛出的任何异常e1e2将首先在同一个处理程序中捕获,并且
  • e1和生成的指针值是被e2评估的删除表达式的操作数,和
  • 在评估delete-expressione2之前对其进行排序,其操作数是由其生成的指针值.e1

C++ 11不允许合并或省略此类分配.

  • @mattnewport是的.见[N3664](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3664.html),于2013年5月被收录到C++ 14工作文件中(根据编辑的说法)报告[N3692](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3692.html)). (2认同)
  • 应该注意的是,这仅仅是*可替换的*全局分配函数.如果编译器可以检测到"new"和朋友没有被替换,那么在as-if规则下允许任何内容. (2认同)