ここではC++テンプレートメタプログラミングを表示ウィキペディアからの例です:このメタプログラミングはどのようにコンパイルされますか?
template <int N>
struct Factorial
{
enum { value = N * Factorial<N - 1>::value };
};
template <>
struct Factorial<0>
{
enum { value = 1 };
};
// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo()
{
int x = Factorial<4>::value; // == 24
int y = Factorial<0>::value; // == 1
}
私は専門が< 0見つかるまで再帰的にNのテンプレートパラメータ値で階乗の種類を作成し、それがどのように動作するかを理解する>、可能になりますコンパイラはチェーン上の値を解決します。
私の質問は次のとおりです。このコンパイルはどのように見えますか?コンパイラは文字通り次のようなものを生成します:
int x = 24;
int y = 1;
これは結果がより複雑になりますか?
実行可能コードまたはそれよりもそのより複雑な場合は定数(24)に置き換えられてFactorial<4>::value
:それは基本的につながる場合、私は思ったんだけどので、私は聞いていますのよ。私は、これが完成プログラムの効率化を助け、ので、これは大いに役立つだろうかを把握しようとしている:)
私は、この場合に生成されたアセンブリ(またはすべての場合でも)は、特定のコンパイラの最適化機能を主に示していると思います。そして私はOPのGCCに言及していない。 – AnT
@AndreyT:「コンパイラによるプルーフ」は多くの証拠ではないことを理解していますが、OPは「私の質問は次のとおりです。しかし、私はあなたの答えが実装の詳細ではなく、言語の要件であることを示すことがはるかに重要であることに同意します。 –