PEにコンパイルおよびリンクされたテンプレートコードは、テンプレートのないコードに比べてサイズが大きくなります。私は、使用されるテンプレートの各インスタンスが順序通りにパックされているので、必要に応じてより速く一致するものを出力すると思います。テンプレートと実行可能ファイル
ご迷惑をおかけして申し訳ありませんが、テンプレートについてよく分かりません。
PEにコンパイルおよびリンクされたテンプレートコードは、テンプレートのないコードに比べてサイズが大きくなります。私は、使用されるテンプレートの各インスタンスが順序通りにパックされているので、必要に応じてより速く一致するものを出力すると思います。テンプレートと実行可能ファイル
ご迷惑をおかけして申し訳ありませんが、テンプレートについてよく分かりません。
C++は原則として動作します。
をお支払いいただきます。
テンプレートコードは、/ Instantiateを使用するコードに対してのみバイナリを作成します。
何百ものSTLコンテナを持つ標準ライブラリに対してコンパイルするだけで、オブジェクトコードにすべてが含まれているわけではなく、使用するものだけが含まれています。
テンプレートはコンパイル時の多態性を実装します。テンプレート化された関数のコピーは、異なるデータ型で行うすべてのインスタンス化に対して作成されます。テンプレート化されたクラスの場合も同様です。このコードはバイナリを作成するためにさらにコンパイルされます。したがって、バイナリのサイズは、テンプレートを持たないコードが生成するよりも大きくなりません。
テンプレート自体にはスペースが全くありません。そのテンプレートのインスタンス化は、それを行います。テンプレートは、タイプパラメータ-MyClass<int> mc
を使用してインスタンス化されます。インスタンス化は、使用するすべてのタイプに対して1回作成されるため、MyClass<int> mc2
は別のインスタンス化を引き起こすのではなく、既存のインスタンス化を使用します。
したがって、実際にテンプレートで使用するタイプの数によって異なります。しかし、これはテンプレート化されていないクラスを使用することと変わりありません。これはコードサイズも増加させます。結論 - 私はそれについて心配しません。 @Alsと@eranによって与えられた回答に加え
'MyClass
いいえ、実装では重複を除去する必要があります(不特定の魔法を使用します)。 LTOは、ファイルの境界を越えて最適化することに関するものです。 –
ありがとう、LTOと不特定の魔法は何ですか? –
:
それらが知る場合、コンパイラおよびリンカーが特定のクラス/関数の二つまたは異なるデータタイプのために同じであるコードを見つけるために集合的に働く、となります同様のコード、つまりデータ型に依存しないである場合、そのコードのコピーを1つ作成することができます。コードは、クラス、特定の関数、またはメソッド/関数の一部のメソッドである可能性があります。
ありがとうAjay。もっと聞くのが好きだけど、今は眠いです。それは3:50で、私は一日中寝ていないか、病気になるでしょう。数時間後にあなたとあなたのすべての人に会いましょう。 –
間違った方法で、少なくとも私はそれをどのように読むか。もし 'MC:: foo()'が 'void MC
2つの機能が同じかどうかは言いませんでした。同じ関数のimplementaionが2つ以上のデータ型が同じ(またはその一部)の場合、コンパイラ/リンカは同じコードセグメントを使用することができます。 – Ajay
ありがとうAls、つまり、タイプが無視されていることを意味します、そうではありませんか? –
@Baby Dolphin:テンプレート型関数/クラスのコピーが各*型ごとに生成されます*更新された答えを確認してください。 –
@Baby - 一方、テンプレートを持っていない場合は、コードを自分でタイプごとに1回書く必要があります。 –