我一直在学习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
计算一次,并且所有其他递归调用都将从查找表中返回。