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

c – gcc 4.7和递归constexpr函数

发布时间:2020-12-16 07:34:36 所属栏目:百科 来源:网络整理
导读:我正在使用constexpr递归进行一些尝试,并尝试查看它是如何编译的,我不明白 gcc在哪些情况下选择在编译时或运行时计算递归. 我正在使用以下阶乘计算代码: #include iostreamconstexpr unsigned int factorial(unsigned int i){ return i 0 ? i*factorial(i-1
我正在使用constexpr递归进行一些尝试,并尝试查看它是如何编译的,我不明白 gcc在哪些情况下选择在编译时或运行时计算递归.

我正在使用以下阶乘计算代码:

#include <iostream>

constexpr unsigned int factorial(unsigned int i)
{
  return i > 0 ? i*factorial(i-1) : 1;
}

int main(void)
{
  std::cout << factorial(X) << std::endl;
}

并且我更改了阶乘中的值x.

>在没有优化的情况下进行编译时,表达式不会在编译时计算.
>使用-O1标志进行编译时,表达式仍未在编译时计算.
>对于-O2,如果x >对于-O3,如果x >如果我在阶乘函数中更改产品的总和,我获得最多10000或更多的编译时计算,并且减少或增加-fconstexpr-depth的值不会改变任何东西.

有谁知道gcc 4.7实现递归函数作为编译时或运行时的规则是什么?

解决方法

如果在编译时需要,constexpr只保证在编译时进行评估.例如,这保证在编译时计算,因为枚举值必须是常量:

enum { VALUE = factorial(X) };
cout << VALUE << endl;

在编译时不需要它的任何情况下,它与将其声明为内联具有相同的效果:它只是一个提示,编译器可以自由地执行它想要的操作.

就像内联一样,现在大多数编译器都会完全忽略你的提示.出于性能原因,编译器希望能够内联事物,即使您没有要求它,并且有自己的算法来确定它何时是不值得的,那么为什么它会在内容中查看内联关键字呢?所有?

(编辑:李大同)

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

    推荐文章
      热点阅读