次の方法で共有


/OPT (最適化)

更新 : 2007 年 11 月

LINK がビルド時に実行する最適化を制御します。

/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{WIN98 | NOWIN98}

引数

  • REF | NOREF
    /OPT:REF を指定すると、参照されない関数とデータが削除されます。/OPT:NOREF を指定すると、参照されない関数とデータが保持されます。

    既定では、パッケージ化された関数で参照されないものは削除されます。/Gy オプションを使用してコンパイルしたオブジェクト ファイルには、パッケージ化された関数 (COMDAT 形式) があります。この最適化は、中間 COMDAT 除去と呼ばれます。この既定の動作をオーバーライドして、参照されていない関数をそのままプログラムに残しておくには、/OPT:NOREF を指定します。特定のシンボルが除去されないようにするには、/INCLUDE オプションを使用します。

    /DEBUG オプションを指定すると、/OPT オプションの既定値が REF から NOREF に変わるため、すべての関数がイメージに保存されます。この既定値をオーバーライドしてデバッグ ビルドを最適化するには、/OPT:REF を指定します。/OPT:REF オプションを使うと、インクリメンタル リンクが行われなくなります。

    データが COMDAT であることを明示的に示す必要があります。__declspec(selectany) で指定します。

    /OPT:REF を指定すると、既定では /OPT:ICF が有効になります。/OPT:REF だけを使用して、/OPT:ICF を使用しない場合は、次のように指定する必要があります。

    link /opt:ref /opt:noicf
    

    /OPT:ICF を指定しても、/OPT:REF オプションは有効になりません。

  • ICF[= iterations**] | NOICF**
    /OPT:ICF[=iterations] を使用すると、同一の COMDAT が折りたたまれ (圧縮され) ます。したがって、リンカ出力から重複した COMDAT を取り除くことができます。iteration には、シンボルの重複を検出するための走査回数を指定します。既定値は 2 回です。反復回数を増やすと、前回の反復で圧縮されなかった重複が検出されることがあります。

    /OPT:REF を明示的に指定して ICF が既定で有効になっている場合と、/OPT:REF,ICF を明示的に指定する場合とでは、リンカの動作が異なります。/OPT:REF を指定した場合の既定の ICF は、読み取り専用データを圧縮しません。これには、.rdata、.pdata、および .xdata が含まれます。一方、/OPT:REF を指定した場合の既定の ICF では、Itanium と x64 のイメージを生成するときに圧縮される関数の数が少なくなります。これらのモジュールの関数は、.pdata や .xdata などの読み取り専用データへの依存性が高いためです。ICF を十分に活用するには、/OPT:ICF を明示的に指定してください。

    /Gy コンパイラ オプションを指定すると、関数は COMDAT 形式で配置され、const データも COMDAT 形式で配置されます。データの折りたたみ (圧縮) の指定方法の例については、「selectany」を参照してください。

    REF が有効な場合は、既定で ICF が有効になります。デバッグ ビルドでは明示的に有効にする必要があります。REF が有効な場合に NOICF を指定できます。

    bxwfs976.alert_note(ja-jp,VS.90).gifメモ :

    /OPT:ICF を指定した結果、異なる関数または読み取り専用のデータ メンバ (/Gy を指定してコンパイルされた const 変数) に同じアドレスが割り当てられることがあります。このため、/OPT:ICF によって、その異なる関数または読み取り専用データ メンバのアドレスに依存しているプログラムが中断される可能性があります。詳細については、「/Gy (関数レベルのリンクの有効化)」を参照してください。

  • WIN98 | NOWIN98
    WIN98NOWIN98 は、最終イメージのセクション配置を制御します。Windows 98 アプリケーションの場合は、セクションを 4 KB 境界上に配置するのが最適です。4 KB 境界上に配置すると、Windows 98 メモリ マネージャは記憶領域の無駄を最小限にして実行可能イメージをキャッシュできるため、読み込み時間が改善されます。リンカでは、この設定が既定で有効になっているため、トリムされたアプリケーション (Windows 98 では速度がやや遅い) を得るには、/OPT:NOWIN98 を指定する必要があります。

    既定では、WIN98 が有効です。WIN98 が有効でないのは、次の場合です。

    • /ALIGN を使用している場合。

    • /MACHINE のターゲットが x86 でない場合。

    • /SUBSYSTEM で WINDOWS または CONSOLE 以外が指定されている場合。

    拡張率が 25% を超えるイメージ (以下の式の平均に基づく) の場合、/OPT:WIN98 は既定では有効になりません。つまり、イメージが小さい場合、/OPT:WIN98 は有効になりません。この調整による影響を受けないようにするには、/OPT:WIN98 を明示的に有効にします。/OPT:NOWIN98 を指定すると、Windows 98 では速度がやや遅くなりますが、アプリケーションのサイズが縮小されます。

    Windows 98 の機能強化は、移植性が高い実行可能イメージでセクションがページ境界上で開始する場合にだけ機能します。/OPT:WIN98 オプションは、必要なファイル配置を実行します。

    Windows NT または Windows 2000 だけで実行するコンポーネントをビルドする場合は、/OPT:NOWIN98 を使用します。

    この変更は、イメージの読み込みやプロセスのワーキング セットには影響しません。影響を受けるのはディスク サイズだけです。

    /OPT:WIN98 を使用した場合のイメージの拡張の平均値を計算するには、次の式が役立ちます。

    • 4096 バイトのファイル配置の場合、無駄な記憶領域の平均値は、イメージのセクション数× 4096/2 で表されます。

    • 現在の 512 バイトのファイル配置の場合、無駄な記憶領域の平均値は、イメージのセクション数× 512/2 で表されます。

    拡張は次のように計算されます。

    • 拡張バイト数 = イメージのセクション数× (4096/2 - 512/2)

      簡単にすると、次のとおりです。

      拡張バイト数 = イメージのセクション数× 1792

      ただし、この式では、イメージ ヘッダーをセクション配置に埋め込む必要性については考慮されていません。ヘッダーは常に 512 バイト以下であるため、ヘッダーの拡張は常に 4096 - 512、つまり 3584 です。

    • 拡張バイト数の平均 = イメージのセクション数× 1792 + 3584

    • 最大拡張バイト数 = イメージのセクション数 × (4096 - 512 + 3584)

    セクション数を得るには、実行可能ファイルに対して DUMPBIN ツールを使用します。イメージのセクションの一覧がサマリに表示されます。通常は、その値に 3 ~ 5 セクションが追加されます。

    ただし、移植性が高い実行可能イメージがごく小さい場合は、/OPT:WIN98 を使用しないでください。ダウンロードする予定のイメージでも、無駄な記憶領域はゼロで埋められて効率よく圧縮されます。

解説

通常、最適化によってイメージのサイズが小さくなり、プログラムの実行速度が向上します。ただし、その代わりにリンク時間が長くなります。

/VERBOSE オプションを使用して、/OPT:REF によって取り除かれた関数や /OPT:ICF によって折りたたまれた (圧縮された) 関数を表示できます。

Visual Studio 開発環境でこのリンカ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「Visual C++ プロジェクトのプロパティの設定」を参照してください。

  2. [リンカ] フォルダをクリックします。

  3. [最適化] プロパティ ページをクリックします。

  4. 次のいずれかのプロパティを変更します。

    • [COMDAT の圧縮]

    • [Windows 98 の最適化]

    • [参照]

このリンカをコードから設定するには

参照

参照

リンカ オプションの設定

リンカ オプション