频繁执行的表达式是否缓存了它的结果?

Does frequently executed expression get its result cached?

for (int i = 0; i < foo + bar; ++i)
{
      // do something
}

假设foo + bar是一个巨大的数字,并且它的值在循环迭代期间不会改变。 (也就是说,循环体不会改变 foobar

foo + bar 的值是否缓存在某处?还是每次都会重新评估?

C/C++ 会以不同于高级语言的方式处理它,例如 Java?

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

话虽如此,如果您的编译器可以确定此加法的结果是不变的,它很可能会这样做。

当然,您的 C++ 编译器是否能够进行此优化取决于您的编译器。您可以使用平台的反汇编程序检查生成的目标代码,以确定您的代码是如何编译的,然后自己找出答案。

如果您想确定这种优化是否发生,您可以自由地 "help" 您的编译器,通过对代码进行适当的更改,您自己这样做。

Java、C 和 C++ 都没有回答这个问题,除非它们都允许通过将计算从循环,从而一次执行一次,前提是编译器(C/C++)或者JVM的JIT编译器(Java)能够证明表达式确实是不变的。

但是,您描述的优化是众所周知的,如果您不禁用优化,则很可能由所有三种语言的实现执行。