/OPT (最適化)
LINK がビルド時に実行する最適化を制御します。
構文
/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{LBR | NOLBR}
引数
REF | NOREF
/OPT:REF を指定すると、参照されない関数とデータが削除されます。/OPT:NOREF を指定すると、参照されない関数とデータが保持されます。
/OPT:REF を有効にすると、LINK によって、未参照のパッケージ化された関数とデータ (COMDAT) が削除されます。 この最適化は、中間 COMDAT 除去として知られています。 /OPT:REF オプションを使うと、インクリメンタル リンクも行われなくなります。
クラス宣言内で定義されているインライン関数とメンバー関数は、常に COMDAT になります。 オブジェクト ファイル内のすべての関数は、/Gy オプションを使用してコンパイルされた場合、COMDAT になります。 const
データを COMDAT 内に配置するには、__declspec(selectany)
を使用してデータを宣言する必要があります。 削除または圧縮するデータを指定する方法については、「selectany」を参照してください。
既定では、/OPT:NOREF または /DEBUG が指定されていない限り、リンカーによって /OPT:REF が有効になります。 この既定の動作をオーバーライドして、参照されていない関数をそのままプログラムに残しておくには、/OPT:NOREF を指定します。 特定のシンボルの削除がオーバーライドされないようにするには、/INCLUDE オプションを使用します。
/DEBUG を指定すると、/OPT の既定値が NOREF になり、すべての関数がイメージに保存されます。 この既定値をオーバーライドしてデバッグ ビルドを最適化するには、/OPT:REF を指定します。 これにより、実行可能ファイルのサイズが小さくなり、デバッグ ビルドでも有用な最適化が可能になります。 /OPT:NOICF も指定して、デバッグ ビルドで同じ関数を保持することをお勧めします。 これにより、スタック トレースを読み取って、圧縮された関数にブレークポイントを設定しやすくなります。
ICF[=iterations] | NOICF
ICF[=iterations] を使用すると、同一の COMDAT が折りたたまれ (圧縮され) ます。 リンカー出力から余分な COMDAT シンボルを削除できます。 省略可能な iterations パラメーターには、シンボルの重複を検出するための走査回数を指定します。 既定値は 1 回です。 イテレーションの回数を増やすと、前回のイテレーションで圧縮されなかった重複が検出されることがあります。
既定では、/OPT:NOICF または /DEBUG が指定されていない限り、リンカーによって /OPT:ICF が有効になります。 この既定値をオーバーライドし、プログラムで COMDAT が折りたたまれるのを防ぐには、/OPT:NOICF を指定します{2}。
デバッグ ビルドでは、/OPT:ICF を明示的に指定して、COMDAT 圧縮を有効にする必要があります。 ただし、/OPT:ICF は、同一のデータまたは関数をマージできるため、スタック トレースに表示される関数名が変更されることがあります。 また、特定の関数にブレークポイントを設定したり、デバッガーで特定のデータを確認したりできなくなり、コードをシングル ステップ実行すると、予期しない関数が発生する可能性があります。 コードの動作は同じですが、デバッガーの表示が非常にわかりづらくなる可能性があります。 したがって、コードを小さくする利点がこうした欠点を上回らない限り、デバッグ ビルドで /OPT:ICF を使用することはお勧めしません。
Note
/OPT:ICF を使用すると、同じアドレスが、さまざまな関数または読み取り専用のデータ メンバー (つまり、/Gy を使用してコンパイルされたときの const
変数) に割り当てられることがあります。このため、その関数や読み取り専用のデータ メンバーの一意のアドレスに依存するプログラムが中断される可能性があります。 詳細については、「/Gy (関数レベルのリンクの有効化)」を参照してください。
LBR | NOLBR
/OPT:LBR オプションおよび /OPT:NOLBR オプションは、ARM バイナリのみに適用されます。 特定の ARM プロセッサの分岐命令の範囲が限られているため、リンカーは、範囲外のアドレスへのジャンプを検出すると、分岐命令の終点アドレスを、実際の終点を対象とする分岐命令を含むコード "アイランド" のアドレスに置き換えます。 /OPT:LBR を使用すると、長い分岐命令の検出と、中間コード アイランドの配置を最適化して、コード全体のサイズを最小化できます。 /OPT:NOLBR は、長い分岐命令が検出されると、最適化を行わずに長い分岐命令のコード アイランドを生成するようにリンカーに指示します。
既定で、/OPT:LBR オプションは、インクリメンタル リンクが有効化されていない場合に設定されます。 非インクリメンタル リンクが必要で、長い分岐命令の最適化が不要な場合は、/OPT:NOLBR を指定します。 /OPT:LBR オプションを使うと、インクリメンタル リンクが行われなくなります。
解説
コマンド ラインで使用した場合、リンカーは既定値の /OPT:REF,ICF,LBR になります。 /DEBUG が指定されている場合、既定値は /OPT:NOREF,NOICF,NOLBR です。
通常、/OPT の最適化によってイメージのサイズが小さくなり、プログラムの実行速度が向上します。 これらの改善は、大規模なプログラムの場合ほど顕著に見られる可能性があります。そのため、製品版ビルドではこれらが既定で有効になっています。
リンカーの最適化では、最初に余分な時間が必要になりますが、最適化されたコードでは、修正するための再配置も少なくなり、最終的なイメージも小さくなります。また、処理して PDB に書き込むデバッグ情報が少ない場合には、さらに時間が節約されます。 最適化を有効にすると、リンク時間が全体的に短縮される可能性があります。これは、分析での多少の追加コストが、バイナリの小規模化によるリンカーの時間節約によって十分に相殺されるためです。
/OPT 引数は、コンマで区切って一緒に指定することもできます。 たとえば、/OPT:REF /OPT:NOICF とする代わりに、/OPT:REF,NOICF と指定することができます。
/VERBOSE リンカー オプションを使用すると、/OPT:REF によって取り除かれた関数や /OPT:ICF によって折りたたまれた (圧縮された) 関数を表示できます。
/OPT 引数は、多くの場合、Visual Studio IDE の [新しいプロジェクト] ダイアログを使用して作成されたプロジェクトに対して設定され、通常はデバッグ構成とリリース構成の値が異なります。 プロジェクトでこれらのリンカー オプションに値が設定されていない場合は、プロジェクトの既定値を取得できます。これは、コマンド ラインでリンカーによって使用される既定値とは異なる場合があります。
Visual Studio 開発環境で OPT:ICF リンカー オプションまたは OPT:REF リンカー オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[リンカー]>[最適化] プロパティ ページを選択します。
次のいずれかのプロパティを変更します。
COMDAT フォールディングを有効にする
参考文献
Visual Studio 開発環境で OPT:LBR リンカー オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[リンカー]>[コマンド ライン] プロパティ ページを選択します。
[追加のオプション] にオプションを入力します。
/opt:lbr
または/opt:nolbr
このリンカーをコードから設定するには
- EnableCOMDATFolding プロパティおよび OptimizeReferences プロパティを参照してください。