for (int i = 0; i < foo + bar; ++i)
{
// do something
}
假设foo + bar
是一个庞大的数字,并且它的值在循环迭代期间不会改变。 (也就是说,循环体不会改变foo
或bar
)
foo + bar
的值是否在某处缓存?或者每次都会重新评估它?
C / C ++会不会处理它与更高级别的语言,例如Java?
答案 0 :(得分:7)
C ++语言规范不需要特定编译器实现的任何特定优化。
话虽如此,如果您的编译器能够确定此addl的结果是不变的,那么很可能会这样做。
当然,您的C ++编译器是否能够进行此优化,取决于您的编译器。您可以使用平台的反汇编程序检查生成的对象代码,以确定代码的编译方式,并自己找出答案。
如果您希望确定会进行此类优化,您可以自由地提供帮助&#34;通过对代码进行适当的更改来自行完成编译。
答案 1 :(得分:7)
Java,C和C ++都没有说明这个问题,除非所有人都允许通过从循环中提取计算来优化实现,以便执行一次只要编译器(C / C ++)或JVM的JIT编译器(Java)可以证明表达式确实是不变的。
您描述的优化是一个众所周知的优化,如果您不禁用优化,它可能会通过所有三种语言的实现来执行。