频繁执行的表达式是否缓存了它的结果?
Does frequently executed expression get its result cached?
for (int i = 0; i < foo + bar; ++i)
{
// do something
}
假设foo + bar
是一个巨大的数字,并且它的值在循环迭代期间不会改变。 (也就是说,循环体不会改变 foo
或 bar
)
foo + bar
的值是否缓存在某处?还是每次都会重新评估?
C/C++ 会以不同于高级语言的方式处理它,例如 Java?
C++ 语言规范不需要特定编译器实现的任何特定优化。
话虽如此,如果您的编译器可以确定此加法的结果是不变的,它很可能会这样做。
当然,您的 C++ 编译器是否能够进行此优化取决于您的编译器。您可以使用平台的反汇编程序检查生成的目标代码,以确定您的代码是如何编译的,然后自己找出答案。
如果您想确定这种优化是否发生,您可以自由地 "help" 您的编译器,通过对代码进行适当的更改,您自己这样做。
Java、C 和 C++ 都没有回答这个问题,除非它们都允许通过将计算从循环,从而一次执行一次,前提是编译器(C/C++)或者JVM的JIT编译器(Java)能够证明表达式确实是不变的。
但是,您描述的优化是众所周知的,如果您不禁用优化,则很可能由所有三种语言的实现执行。
for (int i = 0; i < foo + bar; ++i)
{
// do something
}
假设foo + bar
是一个巨大的数字,并且它的值在循环迭代期间不会改变。 (也就是说,循环体不会改变 foo
或 bar
)
foo + bar
的值是否缓存在某处?还是每次都会重新评估?
C/C++ 会以不同于高级语言的方式处理它,例如 Java?
C++ 语言规范不需要特定编译器实现的任何特定优化。
话虽如此,如果您的编译器可以确定此加法的结果是不变的,它很可能会这样做。
当然,您的 C++ 编译器是否能够进行此优化取决于您的编译器。您可以使用平台的反汇编程序检查生成的目标代码,以确定您的代码是如何编译的,然后自己找出答案。
如果您想确定这种优化是否发生,您可以自由地 "help" 您的编译器,通过对代码进行适当的更改,您自己这样做。
Java、C 和 C++ 都没有回答这个问题,除非它们都允许通过将计算从循环,从而一次执行一次,前提是编译器(C/C++)或者JVM的JIT编译器(Java)能够证明表达式确实是不变的。
但是,您描述的优化是众所周知的,如果您不禁用优化,则很可能由所有三种语言的实现执行。