我一直在尝试在编译时求值的const表达式。但是我玩了一个在编译时执行时似乎很快的示例。
#include<iostream>
constexpr long int fib(int n) {
return (n <= 1)? n : fib(n-1) + fib(n-2);
}
int main () {
long int res = fib(45);
std::cout << res;
return 0;
}
当我运行此代码时,大约需要7秒钟才能运行。到目前为止,一切都很好。但是,当我将long int res = fib(45)
更改为const long int res = fib(45)
时,甚至不需要一秒钟。据我了解,它是在编译时评估的。但是编译大约需要0.3秒
编译器如何能够如此迅速地进行评估,但是在运行时需要花费更多的时间?我正在使用gcc 5.4.0。
编译器缓存较小的值,不需要像运行时版本那样重新计算。(优化器非常好,可以生成很多代码,包括一些特殊情况下的骗术,这对我来说是难以理解的;幼稚的2 ^ 45递归将花费数小时。)