我一直在尝试在编译时求值的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。
这种递归斐波那契效率极低(它具有指数运行时间),所以我的猜测是编译时评估比这更聪明,并且可以优化计算。
—
大火
@AlanBirtles是的,我用-O3编译了它。
—
Peter234
我假设编译器缓存函数调用,该函数只需要被遍历46次(每个可能的参数0-45一次),而不是2 ^ 45次。但是我不知道gcc是否可以那样工作。
—
churill
我知道@Someprogrammerdude。但是,当评估在运行时花费大量时间时,如何快速编译呢?
—
Peter234
fib
。您上面拥有的斐波那契数字的实现速度很慢。尝试将函数值缓存在运行时代码中,它将更快。