堆内存分配的编译器优化
编译器是否可以优化堆内存分配的问题源于对某些编译器执行的观察这种优化,而其他则没有。特别是,clang 3.0 及更高版本优化了以下代码中的新调用:
int main() { int* mem = new int[100]; return 0; }
,而 g 和 Visual Studio 则没有。这引起了人们的担忧,即此类优化可能违反 as-if 规则,该规则要求编译器产生可观察的行为,就像遵循了标准一样。
Clang 优化和 As-if 规则
clang 优化的历史揭示了其有效性。 Clang 的优化遵循 N3664,它允许进行此类优化。然而,这个决定的因果关系仍然值得怀疑。
或者,as-if 规则可以被解释为禁止这样的优化,因为 new 可以抛出异常,这会影响可观察的行为。但是,clang 可能会认为这是一个实现细节,并且它已确定不会引发异常。
Non-Throwing Operator New
The argument for优化对非抛出版本的调用在 as-if 规则下也是有效的。但是,如果存在替换全局运算符 new,则优化可能会违反假设规则。 Clang 之前过于激进的优化,甚至优化了 create() 调用,在后续版本中得到了纠正。
结论
编译器优化堆内存分配的能力仍然是一个问题辩论的主题,对假设规则和代码行为具有潜在影响。虽然 N3664 允许 clang 的优化,但一些论点表明它在某些情况下可能会违反假设规则。对于开发人员来说,了解这些微妙之处并考虑此类优化的可观察后果至关重要。
以上是编译器可以在不违反假设规则的情况下优化堆内存分配吗?的详细内容。更多信息请关注PHP中文网其他相关文章!