2011-08-12 28 views
3

PEにコンパイルおよびリンクされたテンプレートコードは、テンプレートのないコードに比べてサイズが大きくなります。私は、使用されるテンプレートの各インスタンスが順序通りにパックされているので、必要に応じてより速く一致するものを出力すると思います。テンプレートと実行可能ファイル

ご迷惑をおかけして申し訳ありませんが、テンプレートについてよく分かりません。

答えて

5

C++は原則として動作します。
をお支払いいただきます。
テンプレートコードは、/ Instantiateを使用するコードに対してのみバイナリを作成します。

何百ものSTLコンテナを持つ標準ライブラリに対してコンパイルするだけで、オブジェクトコードにすべてが含まれているわけではなく、使用するものだけが含まれています。

テンプレートはコンパイル時の多態性を実装します。テンプレート化された関数のコピーは、異なるデータ型で行うすべてのインスタンス化に対して作成されます。テンプレート化されたクラスの場合も同様です。このコードはバイナリを作成するためにさらにコンパイルされます。したがって、バイナリのサイズは、テンプレートを持たないコードが生成するよりも大きくなりません。

+0

ありがとうAls、つまり、タイプが無視されていることを意味します、そうではありませんか? –

+0

@Baby Dolphin:テンプレート型関数/クラスのコピーが各*型ごとに生成されます*更新された答えを確認してください。 –

+0

@Baby - 一方、テンプレートを持っていない場合は、コードを自分でタイプごとに1回書く必要があります。 –

3

テンプレート自体にはスペースが全くありません。そのテンプレートのインスタンス化は、それを行います。テンプレートは、タイプパラメータ-MyClass<int> mcを使用してインスタンス化されます。インスタンス化は、使用するすべてのタイプに対して1回作成されるため、MyClass<int> mc2は別のインスタンス化を引き起こすのではなく、既存のインスタンス化を使用します。

したがって、実際にテンプレートで使用するタイプの数によって異なります。しかし、これはテンプレート化されていないクラスを使用することと変わりありません。これはコードサイズも増加させます。結論 - 私はそれについて心配しません。 @Alsと@eranによって与えられた回答に加え

+0

'MyClass 'を複数の翻訳単位で言うとどうなりますか?繰り返しコードがありますか? LTOが違いを生み出すのはどこですか? –

+0

いいえ、実装では重複を除去する必要があります(不特定の魔法を使用します)。 LTOは、ファイルの境界を越えて最適化することに関するものです。 –

+0

ありがとう、LTOと不特定の魔法は何ですか? –

0

それらが知る場合、コンパイラおよびリンカーが特定のクラス/関数の二つまたは異なるデータタイプのために同じであるコードを見つけるために集合的に働く、となります同様のコード、つまりデータ型に依存しないである場合、そのコードのコピーを1つ作成することができます。コードは、クラス、特定の関数、またはメソッド/関数の一部のメソッドである可能性があります。

+0

ありがとうAjay。もっと聞くのが好きだけど、今は眠いです。それは3:50で、私は一日中寝ていないか、病気になるでしょう。数時間後にあなたとあなたのすべての人に会いましょう。 –

+0

間違った方法で、少なくとも私はそれをどのように読むか。もし 'MC:: foo()'が 'void MC :: bar()'と 'void MC :: baz()'と同じであれば、リンカは '&MC :: foo!= &MC :: bar'しかし、 'void MC :: *(void)'と 'void MC :: *(void)'ポインタを比較できないので、 'void MC :: baz()'を取り除くことができます。あなたは合法的にポインタを比較することはできません。 – MSalters

+0

2つの機能が同じかどうかは言いませんでした。同じ関数のimplementaionが2つ以上のデータ型が同じ(またはその一部)の場合、コンパイラ/リンカは同じコードセグメントを使用することができます。 – Ajay

関連する問題