2009-12-02 43 views

答えて

68

currently accepted answerはやや不完全です。

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

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

いずれにしても、currently accepted answerとは異なり、COMDATセクションの内容には何らかの要件がありません。 1つのプロシージャ、多くのプロシージャ、データ、またはコードとデータの組み合わせを含むことができます。

5

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

+3

これは古いですが、だれかの情報のために:それはリンカの仕組みではありません。参照されていない関数を制御する全く異なるスイッチがあります:/ OPT:REF(最適化 - >参照:はい)。同じ機能、/ OPT:ICFをマージする別の権利があります。 ICFは/ Gyのみで動作しますが、REFは/ Gyと共に動作します。 – SilverbackNet

関連する問題