如何快速评估const expr

问题描述 投票:8回答:1

我一直在尝试在编译时求值的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。

c++ const constexpr
1个回答
2
投票

编译器缓存较小的值,不需要像运行时版本那样重新计算。(优化器非常好,可以生成很多代码,包括一些特殊情况下的骗术,这对我来说是难以理解的;幼稚的2 ^ 45递归将花费数小时。)

© www.soinside.com 2019 - 2024. All rights reserved.