在 C 中,new 运算符通常用于在堆上分配内存。然而,问题就出现了:是否允许编译器优化这些堆内存分配。
根据 N3664:澄清内存分配,允许编译器围绕内存进行优化分配。这种优化基于“假设”规则,该规则规定,只要结果看起来好像满足了要求,实现就可以忽略要求。由于 new 可以抛出异常,一些人认为由于其可观察的行为,它无法被优化。
然而,优化的支持者认为即使在这种情况下,“假设”规则也适用。他们认为编译器可以确定分配不会导致异常,并且省略新调用不会违反规则。此外,有人认为编译器可以证明替换全局运算符 new 不会影响可观察的行为,从而允许其执行优化。
虽然大多数编译器不会优化新的调用,存在一些例外。例如,Clang 已经实现了后来成为 C 14 一部分的优化。但是,在使用 new 的非抛出版本或可以替换运算符 new 的情况下,可能不会执行优化。
编译器优化堆内存分配的能力是一个复杂的问题,对“as-if”规则的解释各不相同。虽然某些实现允许在某些条件下进行此类优化,但其他实现严格遵循标准并且不执行它。
以上是C 编译器可以使用'new”优化堆内存分配吗?的详细内容。更多信息请关注PHP中文网其他相关文章!