3

テンプレートを次のように宣言するとします。

template <class functor, int index>
class MyClass
{
public:
    MyClass(){someFunction(index);}
private:
    void someFunction(int index)
    {
        while(index--)
            functor();
    }
    int commonFunction(void)
    {
        return M_PI;
    }
};

commonFunction メソッドはテンプレート パラメータに依存しないことに注意してください。

クライアントは次のテンプレートを使用します。

MyClass<func1,100> t1;
MyClass<func2,100> t2;
// ...
MyClass<funci,100> ti;
// where i, for example in 1 .. 1000

テンプレートをインスタンス化すると、バイナリ コードで commonFunction が重複することになりますか?
コンパイラはその重複を防ぐことができますか?
C++ 標準は、重複を防止できると定義しているので、すべてのコンパイラが最適化を提供する必要がありますか?

もちろん、これは、次のように、基本クラスのすべてのテンプレートに共通の機能を実装し、テンプレート化されたクラスの違いを移動することで簡単に解決できます。

class baseMyClass
{
    int commonFunction(void)
    {
        return M_PI;
    }
};

template <class functor, int index>
class MyClass : private baseMyClass
{
public:
    MyClass(){someFunction(index);}
private:
    void someFunction(int index)
    {
        while(index--)
            functor();
    }
};

しかし、私の質問の目的は、次のことを確認することです
。標準化は、私が与えた最適化のように見える場合に実行する必要があると定義しているので、単純にテンプレートを使用してコンパイラに依存することができますか?

4

2 に答える 2

4

標準は、私が与えたもののように見える場合に最適化を実行する必要があると定義しているので、単純にテンプレートを使用してコンパイラに依存できますか?

いいえ、標準では、準拠するコンパイラがそのような種類の最適化を実行することを決して要求していません。コードの肥大化は、テンプレートの欠点の 1 つとして知られています。

これは、関数は定数を返す以外に何もしないため、おそらくインライン化され、インライン化されない場合でも、その関数のいくつかの同一のインスタンス化が生成されたことをリンカーが認識する可能性があるということです。 、それらすべてをマージします。

ただし、この動作は標準では義務付けられていません

于 2013-05-25T10:57:01.227 に答える
0

標準は、どのような場合でも最適化を義務付けていません。したがって、あなたの最後の質問に対する答えは、あなたが考えることができるどのような場合でもノーです。さて、この場合も標準は最適化を妨げません。多くのコンパイラは、この単純なケースで最適化を行うのに十分賢いと思います。

于 2013-05-25T11:01:17.937 に答える