0

私が理解しているように、通常の C++ コードはコンパイル時にアセンブラーに変換され、実行時に CPU によって実行されます。では、テンプレート メタプログラミングの利点に大騒ぎする理由がよくわかりません。

ウィキペディアは、テンプレートのメタプログラミングについて次のように述べています。

テンプレート メタプログラミングは、コンパイラがテンプレートを使用して一時的なソース コードを生成するメタプログラミング手法です。一時的なソース コードは、コンパイラによって残りのソース コードとマージされてからコンパイルされます。これらのテンプレートの出力には、コンパイル時の定数、データ構造、および完全な関数が含まれます。テンプレートの使用は、コンパイル時の実行と考えることができます。

これは、テンプレート メタプログラミングの利点を強調しているようには見えませんでした...?

低レイテンシの C++ アプリケーションの効率を最適化/改善するためにテンプレート メタプログラミングができることに興味があるため、質問しています。途中で何かを正しく理解していない可能性がありますので、お気軽に私の理解を修正してください。

4

2 に答える 2

3

TM について徹底的に議論している無数の記事を読んだことがありますか? 例えば:

テンプレート メタプログラミングの (1 種類の) 簡単な見方は、「強力な」メモ化です。一般的な例は次のとおりです。

プログラムで、ある数値の階乗を計算する必要があるとしましょう。TM を使用すると、コンパイル時に階乗を計算できます。これにより、コンパイル時間 (およびバイナリ サイズ) が増加しますが、ランタイムは減少します。サンプル コードは上記の 2 番目のサイトのものです。「素朴な」方法でそれを行っていた場合、次のようなコードになります。

int factorial( int n) {
    return (n==0) ? 1 : n*factorial(n-1)l
}

int main() {
    cout << factorial(5) << endl;
    return 0;
}

TM を使用すると、コンパイル時に階乗を計算できます。

// factorial.cpp

#include <iostream>

template <int N>
struct Factorial {
    enum { value = N * Factorial<N-1>::value };
};

template <>
struct Factorial<1> {
    enum { value = 1 };
};

// example use
int main() {
    const int fact5 = Factorial<15>::value;
    std::cout << fact5 << endl;
    return 0;
}

これFactorial<15>::valueは基本的にコンパイル時の定数です。いつものように、単純化された例は特に役に立ちませんが、うまくいけばその要点がわかります。

于 2013-02-23T20:25:19.870 に答える
0

別の例は、フィボナッチ数列の計算方法です。

それを行う通常の再帰的な方法:

uint64_t fibonacci(int n) {
    if (n <= 2)
        return 1;
    else
        return fibonacci(n - 1) + fibonacci(n - 2);
}

メタプログラミングの使用:

template< int n > struct Fibonacci {
    static const uint64_t value = Fibonacci< n-1 >::value +  Fibonacci< n-2 >::value;
};

template<> struct Fibonacci< 1 > {
    static const uint64_t value = 1;
};

template<> struct Fibonacci< 0 > {
    static const uint64_t value = 0;
};

fibonacci(80)これで、自分でまたはを呼び出してみることができますFibonacci<80>::value。再帰関数はおそらく機能せずにクラッシュしますが、メタプログラミングを使用する関数は完全に問題なく、非常に高速です。

于 2013-02-24T11:06:01.223 に答える