38

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

4

2 に答える 2

99

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

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

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

于 2010-03-14T02:05:25.170 に答える
6

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

于 2010-12-14T00:26:33.173 に答える