我正在玩一点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
,表达式在编译时计算 ifx < 9
。在此值之后,阶乘以循环的形式内联实现。更改-fconstexpr-depth
标志的值不会改变任何事情。 - 使用
-O3
,表达式是在编译时计算的if x < 7
。在这个值之后,阶乘通过 x86 xmm 扩展实现内联。 - 如果我将乘积更改为阶乘函数中的总和,我将获得最多
10000
或更多的编译时间计算,并且减少或增加 的值-fconstexpr-depth
不会改变任何内容。
有谁知道 gcc 4.7 将递归函数实现为编译时或运行时的规则是什么?