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

时间:2016-08-22 01:55:59

标签: java c++ caching compiler-optimization cpu-cache

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

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

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

C / C ++会不会处理它与更高级别的语言,例如Java?

2 个答案:

答案 0 :(得分:7)

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

话虽如此,如果您的编译器能够确定此addl的结果是不变的,那么很可能会这样做。

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

如果您希望确定会进行此类优化,您可以自由地提供帮助&#34;通过对代码进行适当的更改来自行完成编译。

答案 1 :(得分:7)

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

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