加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用constexpr函数的斐波那契(编译时间与运行时间)

发布时间:2020-12-16 10:07:32 所属栏目:百科 来源:网络整理
导读:我正在使用constexpr来获取斐波纳契数 枚举用于在编译时计算斐波那契数 #include iostreamconstexpr 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)
我正在使用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:usershsinghdocumentsvisual studio 2017projectsconsoleapplication4consoleapplication4source.cpp(12): note: while evaluating 'fibonacci(30)'
1>c:usershsinghdocumentsvisual studio 2017projectsconsoleapplication4consoleapplication4source.cpp(6): note: while evaluating 'fibonacci(31)'
1>c:usershsinghdocumentsvisual studio 2017projectsconsoleapplication4consoleapplication4source.cpp(12): note: while evaluating 'fibonacci(31)'
1>c:usershsinghdocumentsvisual studio 2017projectsconsoleapplication4consoleapplication4source.cpp(12): error C2131: expression did not evaluate to a constant
1>c:usershsinghdocumentsvisual studio 2017projectsconsoleapplication4consoleapplication4source.cpp(5): note: failure was caused by control reaching the end of a constexpr function
1>c:usershsinghdocumentsvisual studio 2017projectsconsoleapplication4consoleapplication4source.cpp(12): note: while evaluating 'fibonacci(32)'
1>c:usershsinghdocumentsvisual studio 2017projectsconsoleapplication4consoleapplication4source.cpp(14): error C2057: expected constant expression
1>Done building project "ConsoleApplication4.vcxproj" -- FAILED.

但是当我使用运行时
????int x = 30,y = 2;
????std :: cout<< fibonacci(x y); //斐波纳契是在运行时计算的

Run Time with memory

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

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

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

解决方法

> constexpr函数在编译时使用的内存是依赖于实现的,但通常应该与运行时相当(大多数编译器将编译并执行该语句). >理论上,应尽可能使用编译时计算表达式.在实践中,它是一个判断调用(也许是SE问题的一个好主题),因为缺点是编译时间增加(可能是内存)和缺乏调试. >看起来您正在达到MSVC在编译时表达式中允许的最大递归限制.我找不到有关此限制的任何文档,但它可以在其他编译器上配置.您的错误是枚举的结果,要求在编译时对其进行全面评估,其中cout调用允许它在编译时和/或运行时执行(如果生成程序集,则应该看到生成的编译时常量)较低的号码呼叫,以及用于高号码呼叫的递归功能).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读