C++:Constexpr斐波那契数列评估
C++: constexpr fibonacci sequence evaluation
我正在研究constexpr,并试图在Stroustrup C++第4版第312页中实现一个例子。 我的理解是fib(45)
计算应该在编译时完成,但我的结果表明计算是在运行时进行的。
有谁知道我在编译时使用constexpr
建立fib(45)
计算时哪里出错了?
感谢您的指导。
#include <iostream>
using namespace std;
constexpr int fib_(int n)
{
return (n < 2) ? 1 : fib_(n - 1) + fib_(n - 2);
}
constexpr int ftbl[] { 1, 2, 3, 5, 8, 13 };
constexpr int fib(size_t n)
{
return (n < sizeof(ftbl)/sizeof(*ftbl)) ? ftbl[n] : fib_(n); }
int main(int argc, char *argv[])
{
cout << fib(45) << endl;
return 0;
}
根据建议更新了代码:
#include <iostream>
using namespace std;
unsigned int fibr(unsigned int n)
{
if (n == 0)
return 0;
if (n == 1)
return 1;
return fibr(n - 1) + fibr(n - 2);
}
constexpr unsigned int ftbl[] { 0, 1, 1, 2, 3, 5, 8, 13 };
constexpr unsigned int fib(size_t n)
{
return (n < sizeof(ftbl)/sizeof(*ftbl)) ? ftbl[n] : fib(n-2) + fib(n-1);
}
int main(int argc, char *argv[])
{
if (argc == 2) {
if (string(argv[1]) == "r") {
unsigned long x = fibr(44);
cout << x << endl;
}
} else {
constexpr unsigned long x = fib(44);
cout << x << endl;
}
return 0;
}
>constexpr
表示可以在编译时计算函数。
此声明:
cout << fib(45) << endl;
不是一个需要编译时求值的上下文fib
,所以编译器可能会也可能不会在运行时计算这个。
您可以强制在编译时对其进行计算,如下所示:
constexpr auto res = fib(42);
cout << res << endl;
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- c++11评估顺序(未定义的行为)
- 反向斐波那契数列
- 如何使用"equal to"以外的评估编写开关语句
- 嵌套 if 中没有返回评估
- 懒惰的参数评估try_emplace?
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- C++17:使用 std::optional 来评估枚举是否包含值
- CNTK:->转发或 ->评估某些电脑上的崩溃,而不是其他电脑上的崩溃
- ConstexPR :GCC比Clang更努力地评估ConstexPR
- 斐波那契数列部分和的最后一位数字
- C++:Constexpr斐波那契数列评估
- C++能保证论点评估的原子性吗?
- 在编译时评估函数开销的通用方法
- 如何使用 std::forward 精确地评估参数包的扩展?
- MSVC 在不知道类型的情况下评估上下文(和错误)
- C++评估顺序优化是否意味着对不同的操作数使用不同的内核?
- 条件分支评估
- C++ constexpr语言 - 可以在编译时评估值吗?