1

次の 2 つの実装は、使用するコンパイラに関係なく、同じパフォーマンスでまったく同じものを生成するのではないかと思います。

template<class T, unsigned int TSIZE> MyClass1
{
    static const unsigned int size_const = 0;
    public:
        inline void Loop()
        {
            for(unsigned int i = 0; i < TSIZE; ++i) {
                /* DO SOMETHING ON DATA */
            }
        }
        T _data[TSIZE];
};

template<class T, unsigned int TSIZE> MyClass2
{
    static const unsigned int size_const = TSIZE;
    public:
        inline void Loop()
        {
            for(unsigned int i = 0; i < size_const; ++i) {
                /* DO SOMETHING ON DATA */
            }
        }
        T _data[size_const];
};

最初のものでは、ループで使用される TSIZE がテンプレート パラメーターであるため、必要に応じてコンパイラがループを展開することがほぼ保証されます。最初のケースでループが展開された場合、2 番目のケースで展開されますか (唯一の違いは、TSIZE が static const に格納されていることです)。

どうもありがとうございました。

4

2 に答える 2

5

コンパイラが最適化を実行するかどうかは、値をコンパイル時の定数として扱うかどうかとは異なります。あなたの特定の例では、 static const がどこにも定義されていないため、リンカーが不平を言わなかった場合、コンパイラはそれを const 式 (コンパイル時定数) としてのみ使用したことを意味します。size_constまた、コンパイラがconst 式と見なしていなかった場合、行T _data[size_const](コピーで失われたと仮定しています) はコンパイルされないことに注意してくださいT

静的メンバーのODR使用(コンパイル時定数として以外の使用) には、定義が必要です。

于 2012-08-03T20:50:08.010 に答える
0

論理的には、コンパイラはあなたが説明している最適化を行うのに十分な情報を持っていますが、実際にそれを行うかどうかは実装に大きく依存しており、普遍的にサポートされるとは思わないでしょう

于 2012-08-03T20:46:47.997 に答える