私は2つの.cppファイル、file1.cppとfile2.cppを持っており、std::vector<int>
を使用しています。 file1.cppにint main(void)
があるとします。私がfile1.oとfile2.oの両方にコンパイルし、2つのオブジェクトファイルを実行可能なELFバイナリにリンクした場合、私は32ビットのUbuntu Linuxマシンでコンパイルしています。テンプレートのC++オブジェクトファイル
- リンカが私の最後のバイナリを作る、コードの重複があります:
私の質問は、コンパイラとリンカがのstd ::ベクトルのシンボルをまとめる方法について?リンカはf1.oのコードのためのテンプレート化されたコードのセットを持っていますか?
std::vector
とf2.oを構成するコードのstd::vector
コードの別のセットはありますか?
Iは、(私はg++ -g
を使用)、私は私の最終的な実行可能な分解を見、そしてf1.oからコードが現れたが、私は、ベクトルのコンストラクタおよび他の方法のために生成されたラベルが明らかにランダムであったが見つかりました。私のためにこれを試みましたf2.oのコードと同じコンストラクタを呼び出したことになります。しかし、私は確信することはできませんでした。
リンカがコードの重複を防止している場合、どうしますか?それはテンプレートが何であるかを「知っている」必要がありますか?複数のオブジェクトファイルにわたって同じテンプレートコードの複数の使用に関するコードの重複を常に防止しますか?
これはOPの質問のほとんどに対応していません。それは本当ですが、ここで何が尋ねられているのかは特に関係ありません。 – templatetypedef
@templatetypedef - 私は違います。 *リンカがコードの重複を防ぐ場合、どうやってそれをしますか?テンプレートはどのようなものかを "知って"いなければなりませんか?リンカは名前のマングリングを通じて知っています。インラインコード - は重複していますが、リンカーはそれと関係がありません。 – littleadv
@ littleadv-あなたはまったく正しいですが、リンカが名前のマングリングを使用する理由、テンプレート関数の名前がどのように正規の関数と異なるのか、リンカがどのバージョンを選択するかなどを決める答えはありません。私はこれがトピック外であるか間違っていると言っているのではなく、むしろ質問に対する答えをすでに知っていない限り、この答えが役に立たないとは思わない。 – templatetypedef