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

时间:2014-11-12 19:36:16

标签: c++ c++11 c++14

我正在观看Jonathan Blow的视频Ideas about a new programming language for games,其中他讨论了他称之为“联合分配”的游戏编程中的常见模式。这个想法是当你有一个类有几个动态分配数组的成员(可能是std::vector,但因为它们是固定大小,更像是建议的std::dynarray)你预先分配了足够的内存存储所有数组数据,只执行一个足够大的分配给所有数组,而不是每个数组一个。

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

1 个答案:

答案 0 :(得分:10)

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

  

5.3.4新[expr.new]

     

10允许实现省略对可替换全局分配函数的调用(18.6.1.1,18.6.1.2)。   当它这样做时,存储由实现提供或通过扩展提供   分配另一个 new-expression 。实现可以扩展 new-expression e1的分配   为 new-expression e2提供存储,如果以下情况属实,则分配未扩展:

     
      
  • 在评估e1
  • 之前,对e2的评估进行了排序   只要e1获得存储,就会评估
  • e2
  •   
  • e1e2都会调用相同的可替换全局分配函数,
  •   
  • 如果e1e2调用的分配函数抛出,则评估中抛出的任何异常   e1e2中的任何一个将首先在同一个处理程序中捕获,并且
  •   
  • e1e2生成的指针值是评估 delete-expressions 的操作数,
  •   
  • 在评估 delete-expression 之前对e2的评估进行了排序,其操作数是e1生成的指针值。
  •   

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