2012-02-20 2 views
3

新しいコンテナを作成しています。テンプレートパラメータの1つは、初期容量です。その結果、異なる初期容量を持つインスタンスを作成すると、コンパイラーはテンプレート化クラスごとに同じコードを生成します。コンパイラは、同様のテンプレートクラスメンバー関数でグローバル最適化を実行できますか?

MyVector<3> firstVector; 
MyVector<4> secondVector; 
... 
if (firstVector.empty() && secondVector.empty()) 
{ 
    ... 
} 

このスニペットを使用すると、コンパイラは両方のクラスに対してempty()を生成します。コンパイラはこの減少を排除できますか?

+0

なぜ初期容量はテンプレートパラメータですか?ちょうど不思議なことに、標準のコンテナはそれなしではうまくいくように見えますが、最適化を行うことはできません(コンテナが自由に拡張できることを意味する* initial *を取る)。 – delnan

答えて

3

まず、empty()はおそらく非常に簡単で、コンパイラはそれをインライン化することができます。インラインにできない場合はどうなりますか?コンパイラは、合併の任意の種類を行うことができますが、それは異なる機能が別個のアドレスを持っているような方法でそれを行う必要があります。

&MyVector<3>::empty() != &MyVector<4>::empty() 

のVisual C++ 10には、リンカの設定に応じて、ここでは非標準の挙動を示すことができます - それは意志、いくつかの設定でそのような機能を検出し、それらをマージするだけで、スタンダードに違反します。私はこれまで標準に準拠した方法でそのような排除を行うことは見ていません。

+1

私はこれが有効な最適化だと思います。関数への2つのポインタは、それらが同じ型を持っていても異なる関数を指している場合、それらを比較しなければなりません。しかし、あなたの関数の型は異なります。 (あなたはMSVC10の一般的なケースについて正しいです、 '/ Gy/OPT:ICF'はこれを引き起こす可能性があります) – MSalters

+0

標準のどの部分がユニークなアドレスを持たなければならないと言いますか? 1.8-6は、オブジェクトが一意のアドレスを持たなければならないが、関数はオブジェクトでなければならないということを示していますか? –

+0

@ edA-qa mort-ora-y:これについての質問は次のとおりです:http://stackoverflow.com/q/8667515/57428 – sharptooth

0

おそらく、コンパイラはこれを排除しません。たとえば次の点を考慮static int iは、関数への排他的でなければなりませんので、上記の場合

template<size_t CAPACITY> 
class MyVector { 
... 
public: 
    bool empty() const { static int i = CAPACITY; return ...; } 
}; 

は、あなたは、すべてのMyVector<N>::empty()は一意である必要があることを見ることができます。 static intが存在しない場合でも、コンパイラは常にその可能性を想定します。したがって、empty()のコピーが生成されると、それはすべてのバージョンに対して生成されます。

私は理論的に答えています。コンパイラが実用的な最適化手法を持っているかどうかはわかりません。その後

template<size_t CAPACITY, typename T> 
class MyVector : public vector<T> 
{ 
    // using vector<T>::empty; 
}; 

、コピーは1つだけ生成されます:あなたのMyVectorはこのように見える場合は、

+2

この引数は保持されません。マージがスタンダードに違反するケースを示しましたが、これは一般的なケースを反論しません。 –

+0

@MatthieMM。、他の回答では、他のアドレス不一致が議論されていたので、これを繰り返すことは避けました。さらに、私の「仮定」は理論的なものです。 – iammilind

+0

私は@MatthieuMに同意します。簡潔な質問のバージョンは、 "そのメソッドがテンプレートのパラメータに依存しない場合、コンパイラはクラステンプレートメソッドの複数のコピーを発行する必要がありますか?"その言葉で、なぜこの議論が成立しないのかは明らかです。 – MSalters

0

empty()メソッドはテンプレートパラメータを使用しますか?そうでない場合は、テンプレート化されたクラスが継承するテンプレート化されていない基本クラスにそれを組み込むことができます。

関連する問題