One*_*ree 0 c++ java caching compiler-optimization cpu-cache
for (int i = 0; i < foo + bar; ++i)
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
假设这foo + bar是一个巨大的数字,并且它的值在循环迭代期间不会改变.(也就是说,循环的身体不会改变foo或bar)
foo + barget 的值是否缓存在某个地方?或者每次都会重新评估?
C/C++会不会处理它与Java等高级语言的不同?
C++语言规范不需要特定编译器实现的任何特定优化.
话虽如此,如果你的编译器可以弄清楚这个additionl的结果是不变的,它可能会这样做.
当然,您的C++编译器是否能够进行此优化,取决于您的编译器.您可以使用平台的反汇编程序检查生成的对象代码,以确定代码的编译方式,并自己找出答案.
如果您希望确保进行这种优化,可以通过对代码进行适当的更改来自行"帮助"编译器.
Java,C和C++都没有说到这个问题,除非所有这些都允许通过从循环中提取计算来优化实现,以便一劳永逸地执行它,只要编译器(C/C++)或者JVM的JIT编译器(Java)可以证明表达式确实是不变的.
但是,您描述的优化是一个众所周知的优化,如果您不禁用优化,它可能会由所有三种语言的实现执行.