gpt4 book ai didi

c++ - C++ 编译器如何如此快速地评估递归 constexpr 函数?

转载 作者:行者123 更新时间:2023-12-03 07:26:48 26 4
gpt4 key购买 nike

我一直在学习 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++ 代码具有更好的计算性能似乎不太正确。
我的问题是,在我按下“构建”按钮和编译完成之间,C++ 编译器是否真的评估了函数?还是我误解了关键字 constexpr ?
编辑:这个程序是用 g++ 7.5.0 编译的与 --std=c++17 .

最佳答案

constexpr函数没有副作用,因此可以放心地内存。鉴于运行时的差异,最简单的解释是编译器在编译时内存 constexpr 函数。这意味着 fibonacci(n)每个 n 只计算一次,所有其他递归调用都从查找表中返回。

关于c++ - C++ 编译器如何如此快速地评估递归 constexpr 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65135537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com