我正在使用constexpr
来获取斐波纳契数
枚举用于在编译时计算斐波纳契
#include <iostream>
constexpr long fibonacci(long long n)
{
return n < 1 ? -1 :
(n == 1 || n == 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2));
}
enum Fibonacci
{
Ninth = fibonacci(9),
Tenth = fibonacci(10),
Thirtytwo = fibonacci(32)
};
int main()
{
std::cout << Fibonacci(Thirtytwo);
// std::cout << fibonacci(32);
return 0;
}
执行时出现以下错误:
1>c:\users\hsingh\documents\visual studio 2017\projects\consoleapplication4\consoleapplication4\source.cpp(12): note: while evaluating 'fibonacci(30)' 1>c:\users\hsingh\documents\visual studio 2017\projects\consoleapplication4\consoleapplication4\source.cpp(6): note: while evaluating 'fibonacci(31)' 1>c:\users\hsingh\documents\visual studio 2017\projects\consoleapplication4\consoleapplication4\source.cpp(12): note: while evaluating 'fibonacci(31)' 1>c:\users\hsingh\documents\visual studio 2017\projects\consoleapplication4\consoleapplication4\source.cpp(12): error C2131: expression did not evaluate to a constant 1>c:\users\hsingh\documents\visual studio 2017\projects\consoleapplication4\consoleapplication4\source.cpp(5): note: failure was caused by control reaching the end of a constexpr function 1>c:\users\hsingh\documents\visual studio 2017\projects\consoleapplication4\consoleapplication4\source.cpp(12): note: while evaluating 'fibonacci(32)' 1>c:\users\hsingh\documents\visual studio 2017\projects\consoleapplication4\consoleapplication4\source.cpp(14): error C2057: expected constant expression 1>Done building project "ConsoleApplication4.vcxproj" -- FAILED.
但是当我使用运行时 int x = 30,y = 2; std :: cout&lt;&lt;斐波那契(x + y); //斐波纳契是在运行时计算的
我不会说我有一个问题,但我很少有这样的混淆:
constexpr
不同?任何示例或参考(如果有)都会有所帮助。
答案 0 :(得分:6)
dimension.partitn_col=table.partitn_col
函数在编译时使用的内存取决于实现,但通常应与运行时相当(大多数编译器将编译并执行该语句)。
理论上,您应该尽可能使用编译时计算表达式。在实践中,它是一个判断调用(也许是SE问题的一个好主题),因为下方是编译时间增加(也许是内存)和缺乏调试。
看起来您正在达到MSVC在编译时表达式中允许的最大递归限制。我找不到有关此限制的任何文档,但它可以在其他编译器上配置。您的错误是constexpr
要求在编译时对其进行全面评估的结果,因为enum
调用允许它在编译时和/或运行时执行(如果生成汇编,则为应该看到为较低数量的调用生成的编译时常量,以及用于高数字调用的递归函数。
答案 1 :(得分:2)
错误的原因是你试图计算Fib数为32的Fib数。这是很多的方法!
你达到了constexpr函数递归的最大限制,因此你看到了一个编译错误。
在运行时,程序会在此时崩溃,但事实并非如此,因为运行时表达式不同 - 它是32的Fib。
答案 2 :(得分:-1)
如果您真的想探索运行时与编译时,那么请看一下模板元编程。简单的斐波那契示例在这里很好地说明:https://medium.com/@milot/fibonacci-sequence-and-c-template-meta-programming-adfa760522ed,将解决方案从水上吹走。