繁体   English   中英

Fibonacci使用constexpr函数(编译时间与运行时间)

[英]Fibonacci using constexpr function (compile time vs run time)

我正在使用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 << fibonacci(x + y); //斐波纳契是在运行时计算的

内存运行时间

我不会说我有一个问题,但我很少有这样的混淆:

  1. 编译时使用的内存和运行时使用constexpr不同?
  2. 我如何知道在何处停止利用或使用编译时数据?
  3. 我还在尝试做的是如何同时使用编译时间和运行时间的优势进行类似Fibo的计算(使用编译直到它可以在此之后让其余的计算在运行时完成)。

任何示例或参考(如果可用)都会有所帮助。

  1. constexpr函数在编译时使用的内存是依赖于实现的,但通常应该与运行时相当(大多数编译器将编译并执行该语句)。

  2. 从理论上讲,应尽可能使用编译时计算表达式。 在实践中,它是一个判断调用(也许是SE问题的一个好主题),因为缺点是编译时间增加(可能是内存)和缺乏调试。

  3. 您似乎正在达到MSVC在编译时表达式中允许的最大递归限制。 我找不到有关此限制的任何文档,但它可以在其他编译器上配置。 您的错误是enum的结果,要求在编译时对其进行全面评估,其中cout调用允许它在编译时和/或运行时执行(如果生成程序集,则应该看到生成的编译时常量)较低的号码呼叫,以及用于高号码呼叫的递归功能)。

错误的原因是你试图计算Fib数为32的Fib数。这是很多的方法!

您达到了constexpr函数递归的最大限制,因此您看到了编译错误。

在运行时,程序会在此时崩溃,但事实并非如此,因为运行时表达式不同 - 它是32的Fib。

如果您非常喜欢探索运行时与编译时,那么请看一下模板元编程。 简单的斐波纳契示例在这里很好地说明: https//medium.com/@milot/fibonacci-sequence-and-c-template-meta-programming-adfa760522ed ,将您的解决方案从水中吹走。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM