私は再帰を少し遊んでいて、それがどのようにコンパイルされるかを確認しようとしていますが、どのような状況でコンパイル時または実行時に再帰を計算するかが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 < 9
。この値の後、階乗はループとしてインラインで実装されます。フラグの値を変更-fconstexpr-depth
しても、何も変わりません。 - を使用
-O3
すると、式はコンパイル時に計算されますif x < 7
。この値の後に、階乗はx86xmm拡張でインラインで実装されます。 - 階乗関数の合計の積を変更すると、コンパイル時の計算が最大
10000
以上になり、の値を-fconstexpr-depth
増減しても何も変わりません。
再帰関数をコンパイル時または実行時に実装するためのgcc4.7のルールを知っている人はいますか?