2017-12-18 7 views
0

テンプレートコードのコードサイズについては疑問があります。 私は2つのベクトルのインスタンスを持っている場合は、C++テンプレート - コードの使用法、バイナリのサイズ

vector<float> v1; 
vector<int> v2; 

は、2つのpush_back実装

push_back(float) 
push_back(int) 

または1つまたは何か他のものとのバイナリにコンパイルされます、次のコード

template<typename T> 
class vector 
{ 
public: 

vector(size_t size) : 
{ 
    array = NEW T[size]; 
} 


uint32_t push_back(T value) 
{ 
... adding value to array and possible array realloction.. 
} 

private: 
T * array; 
} 

ご検討ください!

floatintのクラスではなく、テンプレートを使用してコードサイズを変更できますか?

+7

最適化を使用してコンパイルし、マップファイルを生成します。異なるコンパイラ/リンカは、さまざまなことを行います。 –

+0

あなたのコンパイラ、マシン、最適化レベル、そして月のサイクルによって異なります... – user1810087

+0

一般的なルールはありませんか? GCCはどうですか? –

答えて

0

テンプレートからインスタンス化されたクラスと関数は、実行時にそれらの間に関係がないため、関数が複製されます。

一部のコンパイラは共有/複製コードを最適化しますが、この最適化の有効範囲はテンプレートインスタンスよりも広いです。

コードが同じに見えても、特定の演算子が使用されているときには、異なる関数呼び出しがトリガされることに注意してください。

std::vector<int*>std::vector<char*>のようなポインタコンテナでは特に表示されますが、その動作は実際には同じですが、両方の機能が異なります。

要約すると、テンプレートはコードサイズを小さくするのに優れていますが、多くの異なるインスタンスを作成するとバイナリが肥大化します。

+3

さて、msvcのcomdatフォールディングは、同じアセンブリを持つ関数を削除するので、あなたの主張は一般的に間違っています。 – Yakk

+0

@ tobi303 - 固定。 – egur

+0

@ Yakk - 第2段落でコンパイラの最適化について述べました。事実、多くのテンプレート生成コードは異なるアセンブリを生成します。私は第3章でそれを書いています – egur

関連する問題