经常执行的表达式是否会缓存其结果?

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是一个巨大的数字,并且它的值在循环迭代期间不会改变.(也就是说,循环的身体不会改变foobar)

foo + barget 的值是否缓存在某个地方?或者每次都会重新评估?

C/C++会不会处理它与Java等高级语言的不同?

Sam*_*hik 7

C++语言规范不需要特定编译器实现的任何特定优化.

话虽如此,如果你的编译器可以弄清楚这个additionl的结果是不变的,它可能会这样做.

当然,您的C++编译器是否能够进行此优化,取决于您的编译器.您可以使用平台的反汇编程序检查生成的对象代码,以确定代码的编译方式,并自己找出答案.

如果您希望确保进行这种优化,可以通过对代码进行适当的更改来自行"帮助"编译器.


Joh*_*ger 7

Java,C和C++都没有说到这个问题,除非所有这些都允许通过从循环中提取计算来优化实现,以便一劳永逸地执行它,只要编译器(C/C++)或者JVM的JIT编译器(Java)可以证明表达式确实是不变的.

但是,您描述的优化是一个众所周知的优化,如果您不禁用优化,它可能会由所有三种语言的实现执行.