0

小さな問題を解決するためにいくつかのテンプレートメタプログラミングを使用していますが、構文は少し面倒です-したがって、以下の例では、空のコンストラクターを持つメタクラスの演算子をオーバーロードすると、(実行時)パフォーマンスのペナルティ?すべての一時的なものは実際に構築されますか、それともそれらが最適化されると想定できますか?

template<int value_>
struct Int {
    static const int value = value_;

    template<typename B>
    struct Add : public Int<value + B::value> {  };

    template<typename B>
    Int<value + B::value> operator+(B const&) { return Int<value + B::value>(); }
};

int main()
{
    // Is doing this:
    int sum = Int<1>::Add<Int<2> >().value;

    // any more efficient (at runtime) than this:
    int sum = (Int<1>() + Int<2>()).value;

    return sum;
}
4

2 に答える 2

2

よし、GCC で例を試してみた。

最適化なしのAddバージョン ( -O0) の場合、結果のアセンブリは定数を sum にロードし、それを返します。

operator+最適化なしのバージョン ( -O0) の場合、結果のアセンブリはもう少し処理を行います ( を呼び出しているように見えますoperator+)。

ただし、 では-O3、両方のバージョンが同じアセンブリを生成3し、リターン レジスタに直接ロードするだけです。両方のsumケースで完全に最適化されていました。

したがって、適切なコンパイラを使用しても同じように高速です(最適化がオンになっている限り)。

于 2013-02-25T08:05:51.887 に答える
0

両方のソリューションについて、g++ -O3 -S によって生成されたアセンブリ コードを比較します。両方のソリューションに同じコードを提供します。実際には、単純に 3 を返すようにコードを最適化します。

于 2013-02-25T08:05:40.280 に答える