/LTCG (リンク時のコード生成)

/LTCG を使用して、プログラム全体の最適化を実行するか、またはガイド付き最適化のプロファイル (PGO) インストルメンテーションを作成し、トレーニングを実行して、ガイド付き最適化のプロファイルによるビルドを作成します。

構文

/LTCG[:{INCREMENTAL|NOSTATUS|STATUS|OFF}]

これらのオプションは、Visual Studio 2015 から非推奨とされます。

/LTCG:{PGINSTRUMENT|PGOPTIMIZE|PGUPDATE}

引数

INCREMENTAL
(省略可能) プロジェクト全体ではなく、編集によって影響を受けたファイルにのみ、リンカーによってプログラム全体の最適化またはリンク時のコード生成 (LTCG) を適用することを指定します。 既定では、/LTCG が指定されるとこのフラグは設定されず、プログラム全体の最適化を使用してプロジェクト全体がリンクされます。

NOSTATUS | STATUS
(省略可能) リンクの何パーセントが完了したかを示す進行状況のインジケーターをリンカーによって表示するかどうかを指定します。 既定では、この状態情報は表示されません。

OFF
(省略可能) リンク時のコード生成を無効にします。 リンカーは、 /GL でコンパイルされたすべてのモジュールを、そのオプションなしでコンパイルされているかのように扱い、MSIL モジュールによってリンクが失敗します。

PGINSTRUMENT
(省略可能) このオプションは、Visual Studio 2015 から非推奨とされます。 代わりに、/LTCG/GENPROFILE または /FASTGENPROFILE を使用して、ガイド付き最適化のプロファイル用にインストルメント化されたビルドを生成します。 インストルメント化された実行から収集されるデータは、最適化されたイメージの作成に使用されます。 詳細については、「ガイド付き最適化のプロファイル」を参照してください。 このオプションの短い形式は /LTCG:PGI です。

PGOPTIMIZE
(省略可能) このオプションは、Visual Studio 2015 から非推奨とされます。 最適化されたイメージをビルドするには、代わりに /LTCG/USEPROFILE を使用します。 詳細については、「ガイド付き最適化のプロファイル」を参照してください。 このオプションの短い形式は /LTCG:PGO です。

PGUPDATE
(省略可能) このオプションは、Visual Studio 2015 から非推奨とされます。 最適化されたイメージをリビルドするには、代わりに /LTCG/USEPROFILE を使用します。 詳細については、「ガイド付き最適化のプロファイル」を参照してください。 このオプションの短い形式は /LTCG:PGU です。

解説

/LTCG オプションでは、コンパイラを呼び出してプログラム全体の最適化を実行するようにリンカーに指示します。 または、ガイド付き最適化のプロファイルを実行することもできます。 詳細については、「ガイド付き最適化のプロファイル」を参照してください。

次の例外を除き、以前の PGO 初期化の組み合わせである /LTCG および /GENPROFILE オプションで指定されていないリンカー オプションを、PGO の組み合わせである /LTCG/USEPROFILE に追加することはできません。

/LTCG/USEPROFILE を使用してビルドする際に、PGO の初期化のために /LTCG および /GENPROFILE オプションと共に指定されているリンカー オプションを指定する必要はありません。これらは暗黙的に指定されます。

この記事の残りの部分では、/LTCG によって実行されるリンク時のコード生成について説明します。

/LTCG は、/GL で暗黙的に指定されます。

リンカーでは、/GL または MSIL モジュールを使用してコンパイルされたモジュールを渡された場合、リンク時のコード生成が呼び出されます (「リンカー入力としての .netmodule ファイル」を参照)。 明示的に /LTCG を指定せずに /GL または MSIL モジュールをリンカーに渡すと、最終的にリンカーによってこの状況が検出され、/LTCG を使用してリンクが再実行されます。 明示的に /LTCG を指定した上で /GL と MSIL モジュールをリンカーに渡すと、最大限に高速のパフォーマンスでビルドされます。

さらに高速なパフォーマンスを実現するには、/LTCG:INCREMENTAL を使用します。 このオプションでは、プロジェクト全体ではなく、ソース ファイルの変更によって影響を受けるファイルのみを再最適化するようにリンカーに指示します。 このオプションを使用すると、リンクに必要な時間を大幅に短縮できます。 このオプションは、インクリメンタル リンクと同じオプションではありません。 /LTCG:INCREMENTAL オプションを削除する場合は、ビルド時間とディスク使用率を向上させるために、/LTCGOUTオプションも削除します。

/LTCG は、/INCREMENTAL では使用できません。

/Og/O1/O2、または /Ox を使用してコンパイルされたモジュールを、/LTCG を使用してリンクすると、次の最適化が実行されます。

  • クロス モジュールのインライン化

  • プロシージャ間のレジスタ割り当て (64 ビット オペレーティング システムのみ)

  • カスタムの呼び出し規約 (x86 のみ)

  • 小規模な TLS 変位 (x86 のみ)

  • スタックの二重配置 (x86 のみ)

  • メモリのあいまいさ排除の強化 (グローバル変数および入力パラメーターの干渉情報の改善)

Note

リンカーにより、各関数のコンパイルにどの最適化が使用されたかが判断され、リンク時に同じ最適化が適用されます。

/LTCG/O2 を使用すると、二重配置の最適化が適用されます。

/LTCG/O1 を指定すると、二重配置は実行されません。 アプリケーション内のほとんどの関数が速度を対象としてコンパイルされ、数個の関数がサイズを対象としてコンパイルされている (たとえば、optimize プラグマを使用) 場合、それらによって二重配置を必要とする関数が呼び出されると、コンパイラによってサイズを対象として最適化された関数が二重配置されます。

コンパイラが関数のすべての呼び出しサイトを識別できる場合、コンパイラは明示的な呼び出し規約修飾子を無視し、関数の呼び出し規則を最適化しようとします。

  • レジスタでパラメーターを渡す

  • 配置のためにパラメーターを並べ替える

  • 使用されていないパラメーターを削除する

関数ポインターを介して関数が呼び出された場合、または /GL を使用してコンパイルされたモジュールの外部から関数が呼び出された場合、コンパイラでは関数の呼び出し規則の最適化は試行されません。

Note

/LTCG を使用して mainCRTStartup を再定義した場合、アプリケーションでは、グローバル オブジェクトの初期化前に実行されるユーザー コードに関連する、予期しない動作が生じる可能性があります。 この問題に対処するには次の 3 つの方法があります。mainCRTStartup を再定義しないこと、/LTCG を使用して mainCRTStartup が含まれているファイルをコンパイルしないこと、グローバル変数およびオブジェクトを静的に初期化することです。

/LTCG と MSIL モジュール

/GL/clr を使用してコンパイルされたモジュールは、/LTCG が指定されている場合にリンカーへの入力として使用できます。

  • /LTCG では、ネイティブ オブジェクト ファイル、および混在ネイティブ/マネージド オブジェクト ファイル (/clr を使用してコンパイルされる) を受け付けることができます。 /clr:pure および /clr:safe コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 以降ではサポートされていません。

  • /LTCG:PGI では、/GL および /clr を使用してコンパイルされたネイティブ モジュールは受け付けられません

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

プログラム全体の最適化プロパティは、 /LTCGなど、いくつかのコンパイラおよびリンカー オプションを設定します。 このプロパティを使用して、ビルド構成全体の設定を変更することをお勧めします。 プロジェクトのプログラム全体の最適化を設定するには:

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「コンパイラとビルドのプロパティを設定する」をご覧ください。

  2. [構成プロパティ]>[全般] プロパティ ページを選択します。

  3. [プログラム全体の最適化] プロパティを変更します。 [OK] または [適用] を選択して、変更内容を保存します。

または、/LTCG を特定のビルドに適用するために、メニュー バーで [ビルド]>[ガイド付き最適化のプロファイル] を選択する、あるいは、プロジェクトのショートカット メニューから [ガイド付き最適化のプロファイル] のいずれかのオプションを選択するという方法もあります。

リンク時コード生成を個別に有効にするか、特定のリンク時刻コード生成オプションを設定するには:

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。

  2. [構成プロパティ]>[リンカー]>[最適化] プロパティ ページを選択します。

  3. Link Time Code Generation プロパティを次のいずれかのオプションに変更します。

    • 既定値
    • 高速リンク時間コード生成を使用する (LTCG:増分)
    • リンク時コード生成を使用する (LTCG)
    • ガイド付き最適化のプロファイル - インストルメント (LTCG:PGInstrument)
    • ガイド付き最適化のプロファイル - 最適化 (LTCG:PGOptimize)
    • ガイド付き最適化のプロファイル - 更新 (LTCG:PGUpdate)
  4. [OK] または [適用] を選択して、変更内容を保存します。

リンカーがリンク時間コード生成の進行状況インジケーターを表示するかどうかを指定するには:

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。

  2. [構成プロパティ]>[リンカー]>[全般] プロパティ ページを選択します。

  3. Link Status プロパティを変更します。 [OK] または [適用] を選択して、変更内容を保存します。

このコンパイラ オプションをコードから設定するには

関連項目

MSVC リンカーのリファレンス
MSVC リンカー オプション