2016-07-29 1 views
2

私はかなり長い間C++でプログラミングしてきたので、テンプレートをたくさん使って楽しんでいます。私が最近組み込みプログラミングに取り組んできたことで私が最近疑問に思っていたのは、テンプレートパラメータが異なるテンプレートインスタンスでコードの重複に関してリンカがどのように動作するのかということです。これがうまくリンク時間の間、離れて最適化することが知られている同じパラメータで同じテンプレートの複数のインスタンスのためにリンカーは通常、異なるC++テンプレートインスタンスから重複したコードを最適化しますか?

(参照:How does C++ link template instancesを)リンカが任意の重複を認識した場合

はしかし私の場合、私は興味異なるパラメータでインスタンス化された2つのテンプレート間のコード。彼らは異なるタイプなので、私は彼らが自動的に崩壊しないだろうと思います。しかし、テンプレートパラメータに依存せず、したがって2つのクラス間で同一であるいくつかの関数を持つ可能性があるので、リンカがそれらを最適化して空間を節約できると想定するかもしれません。

この場合、どのような動作が期待できますか?

+0

godboltを試しましたか? – lorro

+0

はい、例えばhttps://godbolt.org/g/jbx2msを参照してください。ただし、これはリンカーではなく私が理解できる限りコンパイラです。リンカが最適化できる底に同じコードがありますが、それが普通かどうかわかりません。 – Blackclaws

答えて

5

金リンカーはまさにそうです。

Safe ICF: Pointer Safe and Unwinding Aware Identical Code Folding in Gold

私たちは、大規模なC++のアプリケーションと共有ライブラリは、そのコードが他の機能と同一である多くの機能を持っている傾向があることを発見しました。このような同一の機能を単一のコピーにマージすることによって、理論的にはコードの10%を除去することができます。この最適化、同一コード折り畳み(ICF)は、金のリンカーで実装されています。リンク時に、ICFは同一のオブジェクトコードを持つ関数を検出し、それらを1つのコピーにマージします。

+0

よく見えます。 gccにはhttps://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlをリンクするオプションがありますが、いくつかのものは金でしか認識されないものの、いくつかのものはgcc – Blackclaws

+0

@Blackclaws私は2011年からゴールドリンカーを使用していました。古いldより数倍速くリンクしていて、 '-detect-odr-violations'という素晴らしい機能があるのが好きです。 –

関連する問題