web-dev-qa-db-ja.com

COMDATセクションは何に使用されますか?

/ Gyオプションが表示され、なぜそれを使用するのか疑問に思っていますか? http://msdn.Microsoft.com/en-us/library/xsa71f43.aspx

29
Scott J

現在受け入れられている回答 はやや不完全です。

COMDATセクションの目的は、「重複」セクションを複数のオブジェクトファイルで定義できるようにすることです。通常、同じシンボルが複数のオブジェクトファイルで定義されている場合、リンカーはエラーを報告します。これにより、テンプレートなどの一部のC++言語機能で問題が発生し、異なるcppファイルで同じシンボルがインスタンス化される可能性があります。

COMDATセクションは、これを回避するために使用されます。セクションがオブジェクトファイルでCOMDATとしてマークされている場合、競合を解決する方法を示すフラグも指定します。 「好きな人を選ぶ」、「すべての複製が同じサイズであることを確認する」、「すべての複製が同じ内容であることを確認する」、「最大のものを選択する」など、さまざまなオプションがあります。を参照してください。完全なリストのCOFF仕様。

いずれにせよ、 現在受け入れられている回答 が言ったこととは異なり、COMDATセクションの内容がどうあるべきかについての要件はありません。これらには、1つのプロシージャ、多くのプロシージャ、データ、またはコードとデータの両方の任意の組み合わせを含めることができます。

82

/ Gyオプションは、リリースビルドで使用するのに適しています。 'すべての関数には独自のセクションがあるため、リンカは未使用のコードをすべて削除できます。/Gyオプションを指定しない場合、次のようになります。「a.cpp」は3つの関数を定義し、コンパイラーはコンパイル時にそれらを1つのコードセクションに配置します。 「main.cpp」は「a.cpp」の関数を1つだけ使用しますが、「a.cpp」のすべての関数をリンクするとリンクされます(そのうちの2つは負担として)。また、すべての関数に独自のセクションがある場合、リンカーは「main.cpp」に必要な関数を含むセクションを1つだけ取得できます。/Gyオプションなしでコンパイルすると、デバッグビルドに適しています。クラスをコンパイルするとき、そのすべてのメソッドはデフォルトで独自の個別のセクションを取得します。

5