整数の中に入ることができる階乗が限られているため、最初の20個の値を手作業で事前計算して、グローバルまたは静的配列に格納するだけで済みます。次に、配列内の階乗をルックアップするために、グローバルまたは静的関数を使用する:あなたはfactorial
の引数としてリテラルを使用
#include <iostream>
const int factorials[] =
{
1,
1,
2,
6,
24,
// etc...
};
inline const int factorial(int n) {return factorials[n];}
int main()
{
static const int fourFactorial = factorial(4);
std::cout << "4! = " << fourFactorial << "\n";
}
場合は、最適化が有効になっている場合、コンパイラは、単純に(結果と関数呼び出しを置き換える必要があります)。私は(Macの)XCodeの4.4で上記の例を試みたと私はそれが定数24とfourFactorial
を初期化アセンブリに参照:
.loc 1 20 38 ## /Users/emile/Dev/sandbox/sandbox/main.cpp:20:38
movl $24, __ZZ4mainE13fourFactorial(%rip)
この方法は、高速コンパイルをもたらすことができるよりも再帰コンパイル時間を用いてトリック。
テンプレートが反復できる深さが限られているので、コンパイル時の階乗計算からのスピードアップはそれほど大きくはありません(動的プログラミングを使用する場合は特にそうです)。 –
この質問の "R .."の回答を参照してください:http://stackoverflow.com/questions/3786207/howto-compute-the-factorial-of-x。オーバーフローは非常に可能性が高いですなぜBoostはあなたがこれのためにintを使用することを望んでいません。 – mwigdahl
@mwigdahl私は20までフィットすることができます! (しかし、オーバーフローをチェックすることは、私がライブラリ関数を使うことを好む理由の1つになるでしょう、私の実装はそれをチェックしません)。 – gnzlbg