【问题标题】:Does frequently executed expression get its result cached?频繁执行的表达式是否会缓存其结果?
【发布时间】:2016-12-28 11:14:37
【问题描述】:
for (int i = 0; i < foo + bar; ++i)
{
      // do something
}

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

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

C/C++ 的处理方式是否与 Java 等高级语言不同?

【问题讨论】:

  • 选择第一名的语言。行为可能非常不同。
  • 好吧,我确实提到了 Java 和 C++
  • 您可以尝试将foo + bar 替换为实际数字,试一试,看看哪个花费的时间最长,实际差异有多大。
  • 这遗漏了一些细节。 foo 是什么,bar 是什么? operator+ 函数是否涉及内联(甚至可能是内置函数?)并且 foobar 的地址是否逃脱了循环,它们甚至是全局/文件范围吗?
  • 嗯,与 C++ 相比,Java 不是“高级语言”,除了 Java 头的狂热梦想。

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


【解决方案1】:

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

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

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

如果您想确定发生这种优化,您可以自行“帮助”您的编译器,对代码进行适当的更改。

【讨论】:

    【解决方案2】:

    Java、C 和 C++ 都没有谈到这个问题,除非它们都允许通过将计算提升到循环之外来优化实现,以便执行一次全部,前提是编译器(C/C++)或者JVM的JIT编译器(Java)可以证明表达式确实是不变的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2011-01-10
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      相关资源
      最近更新 更多