c – gcc 4.7和递归constexpr函数

我正在使用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;

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

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

点赞