首页 >后端开发 >C++ >编译器可以优化掉 C 中的'新”调用吗?

编译器可以优化掉 C 中的'新”调用吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-02 00:19:15702浏览

Can Compilers Optimize Away `new` Calls in C  ?

编译器可以消除堆内存分配吗?

在 C 中,new 运算符用于在堆上分配内存。编译器可以优化代码,包括删除不必要的语句。编译器可以消除使用 new 进行的堆内存分配吗?

编译器行为

研究表明不同的编译器以不同方式处理堆分配:

  • g (5.2.0) 和 Visual Studio 2015 不会优化新的调用。
  • clang (3.0 ) 优化新调用,即使具有完整的优化标志。

优化的有效性

有效性编译器优化是一个有争议的话题。有些人认为编译器不允许优化新调用,因为它们可能具有可观察到的行为(例如抛出异常)。其他人认为,如果编译器可以保证不会影响任何可观察的行为,则允许优化新调用。

C 14 标准

N3664:澄清内存分配澄清了有关编译器优化和内存分配的规则。它允许编译器在某些情况下优化内存分配。然而,该条款受到批评,因为它可能违反因果关系。

其他注意事项

  • 不抛出新:Clang 还进行了优化out 调用非抛出 new运算符。
  • 重写的运算符 new:不同翻译单元中的自定义全局运算符 new 实现可能会影响与堆分配相关的编译器优化的有效性。

结论

编译器优化堆内存分配的能力是一个复杂的问题涉及编译器行为、语言标准和潜在的异常。虽然一些编译器基于 N3664 实现了这种优化,但其有效性仍然是一个讨论的主题,并且取决于具体情况,包括 C 标准和自定义内存分配器的存在。

以上是编译器可以优化掉 C 中的'新”调用吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn