我一直在学习C++ constexpr函数,并实现了constexpr递归函数以查找第n个斐波那契数。

#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>

constexpr long long fibonacci(int num) {
    if (num <= 2) return 1;
    return fibonacci(num - 1) + fibonacci(num - 2);
}

int main() {
    auto start = clock();
    long long num = fibonacci(70);
    auto duration = (clock() - start) / (CLOCKS_PER_SEC / 1000.);
    std::cout << num << "\n" << duration << std::endl;
}
如果我从constexpr函数中删除了fibonacci()标识符,则fibonacci(70)会花费很长时间评估(超过5分钟)。但是,当我保持原样时,该程序仍会在3秒内完成编译,并在不到0.1毫秒的时间内输出正确的结果。
我了解到constexpr函数在编译时为评估为,因此这意味着fibonacci(70)由编译器在不到3秒的时间内计算出来!但是,C++编译器比C++代码具有更好的计算性能似乎并不正确。
我的问题是,在我按下“Build”按钮到编译完成之间,C++编译器实际上会评估功能吗?还是我误解了关键字constexpr
编辑:该程序是使用g++ 7.5.0--std=c++17编译的。

最佳答案

constexpr函数没有副作用,因此可以轻松记住它。考虑到运行时的差异,最简单的解释是编译器会在编译时记住constexpr函数。这意味着fibonacci(n)仅对每个n计算一次,并且所有其他递归调用都将从查找表中返回。

10-04 22:01
查看更多