相关疑难解决方法(0)

编译时如何(指数)比运行时更快?

以下代码通过指数缓慢的算法计算斐波纳契数:

#include <cstdlib>
#include <iostream>

#define DEBUG(var) { std::cout << #var << ": " << (var) << std::endl; }

constexpr auto fib(const size_t n) -> long long
{
    return n < 2 ? 1: fib(n - 1) + fib(n - 2);
}

int main(int argc, char *argv[])
{
    const long long fib91 = fib(91);

    DEBUG( fib91 );
    DEBUG( fib(45) );

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我在运行时计算第45个Fibonacci数,在编译时计算第91个.

有趣的是,GCC 4.9编译代码并fib91在几分之一秒内完成计算,但需要一段时间才能吐出fib(45).

我的问题:如果GCC足够聪明以优化fib(91)计算而不是采用指数缓慢的路径,那么它会阻止它做同样的事情fib(45)吗?

以上是否意味着GCC产生两个编译版本的fib函数,其中一个是快速的而另一个是指数级的慢? …

c++ compiler-construction gcc constexpr c++11

48
推荐指数
2
解决办法
2695
查看次数

标签 统计

c++ ×1

c++11 ×1

compiler-construction ×1

constexpr ×1

gcc ×1