首页 >后端开发 >C++ >C 编译器可以使用'new”优化堆内存分配吗?

C 编译器可以使用'new”优化堆内存分配吗?

Patricia Arquette
Patricia Arquette原创
2024-12-02 02:15:11565浏览

Can C   Compilers Optimize Out Heap Memory Allocations Using `new`?

优化堆内存分配

在 C 中,new 运算符通常用于在堆上分配内存。然而,问题就出现了:是否允许编译器优化这些堆内存分配。

优化的争论

根据 N3664:澄清内存分配,允许编译器围绕内存进行优化分配。这种优化基于“假设”规则,该规则规定,只要结果看起来好像满足了要求,实现就可以忽略要求。由于 new 可以抛出异常,一些人认为由于其可观察的行为,它无法被优化。

反驳:“假设”规则

然而,优化的支持者认为即使在这种情况下,“假设”规则也适用。他们认为编译器可以确定分配不会导致异常,并且省略新调用不会违反规则。此外,有人认为编译器可以证明替换全局运算符 new 不会影响可观察的行为,从而允许其执行优化。

变化和异常

虽然大多数编译器不会优化新的调用,存在一些例外。例如,Clang 已经实现了后来成为 C 14 一部分的优化。但是,在使用 new 的非抛出版本或可以替换运算符 new 的情况下,可能不会执行优化。

结论

编译器优化堆内存分配的能力是一个复杂的问题,对“as-if”规则的解释各不相同。虽然某些实现允许在某些条件下进行此类优化,但其他实现严格遵循标准并且不执行它。

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

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