编译器可以消除堆内存分配吗?
在 C 中,new 运算符用于在堆上分配内存。编译器可以优化代码,包括删除不必要的语句。编译器可以消除使用 new 进行的堆内存分配吗?
编译器行为
研究表明不同的编译器以不同方式处理堆分配:
优化的有效性
有效性编译器优化是一个有争议的话题。有些人认为编译器不允许优化新调用,因为它们可能具有可观察到的行为(例如抛出异常)。其他人认为,如果编译器可以保证不会影响任何可观察的行为,则允许优化新调用。
C 14 标准
N3664:澄清内存分配澄清了有关编译器优化和内存分配的规则。它允许编译器在某些情况下优化内存分配。然而,该条款受到批评,因为它可能违反因果关系。
其他注意事项
结论
编译器优化堆内存分配的能力是一个复杂的问题涉及编译器行为、语言标准和潜在的异常。虽然一些编译器基于 N3664 实现了这种优化,但其有效性仍然是一个讨论的主题,并且取决于具体情况,包括 C 标准和自定义内存分配器的存在。
以上是编译器可以优化掉 C 中的'新”调用吗?的详细内容。更多信息请关注PHP中文网其他相关文章!