オフラインで私と連絡を取った人からの回答。これらのオプションをよりよく理解するのに役立ちました。
===================================
それは本質的に真実です。C または C++ だけを話し、メンバー関数を使用しないとします。/Gy を指定しないと、コンパイラはある意味で縮小不可能なオブジェクト ファイルを作成します。リンカーがオブジェクトから 1 つの関数だけを必要とする場合、リンカーはそれらすべてを取得します。これは、ライブラリのプログラミングにおける特別な考慮事項です。たとえば、ライブラリのユーザーに親切にする場合は、ライブラリを多数の小さなオブジェクト ファイル (通常はオブジェクトごとに 1 つの非静的関数) として記述する必要があります。ライブラリは、実際には実行されないコードを実行する必要があるため、肥大化することはありません。
/Gy を指定すると、コンパイラは COMDAT を持つオブジェクト ファイルを作成します。各関数は、ある程度ミニ オブジェクトである独自の COMDAT にあります。リンカがオブジェクトから 1 つの関数だけを必要とする場合は、その関数だけを選択できます。リンカーの /OPT スイッチを使用すると、リンカーがこの選択性を使用して何を行うかをある程度制御できますが、/Gy がないと何も選択できません。
または非常に少ない。たとえば、リンカが、オブジェクト ファイル内のコード全体であり、たまたま同一のコードを持つ関数を折りたたむことができることは、少なくとも考えられます。リンカーが、参照されているものを何も含まないオブジェクト ファイル全体を削除できることは確かに考えられます。結局のところ、これはライブラリ内のオブジェクト ファイルで行われます。ただし、実際には、COMDAT 以外のオブジェクト ファイルをリンカーのコマンド ラインに追加する場合は、参照されていなくてもバイナリでそれが必要であると言っているというルールがありました。考えられることと実際に行われたことの違いは、通常、非常に大きいものです。
それでは、簡単な答えに固執するのが最善です。リンカー オプションは、各オブジェクト ファイル内から関数 (および変数) を分離できるという利点がありますが、分離は、コンパイラの作業である COMDAT に編成されるコードとデータに依存します。
===================================