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

/LTCG[:NOSTATUS|:STATUS|:PGINSTRUMENT|:PGOPTIMIZE|:PGUPDATE]

解説

それぞれの文字について以下に説明します。

  • :NOSTATUS |:STATUS (省略可能)
    リンク処理の完了した割合を示す進行状況インジケーターを表示するかどうかを指定します。 既定では、ステータス情報は表示されません。

  • :PGINSTRUMENT (省略可能)
    インストルメント化されたテストをアプリケーションで実行するための準備として .pgd ファイルを出力する必要があることを指定します。 オプションで /PGD を指定し、既定以外の名前や場所を指定して .pgd ファイルを作成できます。

    インストルメント化された実行から収集されるデータは、最適化されたイメージを作成するために使用します。 詳細については、「ガイド付き最適化のプロファイル」を参照してください。 このオプションの省略形は /LTCG:PGI です。

  • :PGOPTIMIZE (省略可能)
    インストルメント化されたバイナリの実行後に作成されたプロファイル データを使用して、最適化されたイメージを作成する必要があることを指定します。 すべての入力ファイルが、/LTCG:PGI で指定されたファイルと一致することが必要です。 詳細については、「ガイド付き最適化のプロファイル」を参照してください。 このオプションの省略形は /LTCG:PGO です。

  • :PGUPDATE (省略可能)
    入力ファイル リストの追加、または :PGINSTRUMENT フェーズで指定された入力ファイル リストの変更を可能にします。 ただし、入力ファイルはガイド付き最適化のプロファイルで最適化されません。また、変更された入力ファイルの変更部分がコードのインストルメンテーション フェーズの処理中に収集されたプロファイル データを無効にする場合、その変更部分はガイド付き最適化のプロファイルで最適化されません。 詳細については、「ガイド付き最適化のプロファイル」を参照してください。 このオプションの省略形は /LTCG:PGU です。

解説

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

次の例外では、/LTCG:PGINSTRUMENT の実行で指定されなかった /LTCG:PGOPTIMIZE または /LTCG:PGUPDATE の実行に対して、他のリンク オプションを追加できません。

/LTCG:PGINSTRUMENT に指定されたリンカー オプションは、/LTCG:PGOPTIMIZE に指定する必要はありません。これらは暗黙に指定されます。

このトピックでは、これ以降、リンク時のコード生成に関する /LTCG についてのみ説明します。

/GL を指定すると /LTCG も指定されます。

リンカーは、/GL を指定してコンパイルされたモジュール、または MSIL モジュールを渡された場合に、リンク時コード生成を呼び出します。詳細については、「リンカー入力としての .netmodule ファイル」を参照してください。 /GL を指定してコンパイルされたモジュール、または MSIL モジュールをリンカーに渡すときに /LTCG を明示的に指定しないと、リンカーはこのことを検出し、/LTCG を指定してリンクを再起動します。 /GL を指定したコンパイルしたモジュールおよび MSIL モジュールをリンカーに渡すときは、ビルドのパフォーマンスをできる限り高めるために、/LTCG を明示的に指定します。

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

/LTCG を /Og/O1/O2、または /Ox のいずれかと共に指定すると、次の最適化が行われます。

  • モジュール間のインライン展開

  • 関数を超えたレジスタ割り当て (64 ビット オペレーティング システムのみ)

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

  • 小さい TLS の変位 (x86 のみ)

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

  • メモリの一義化 (グローバル変数および入力パラメーターの干渉情報の改善)

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

/LTCG と /Ogs を指定した場合、二重配置は行われません。 アプリケーション内のほとんどの関数が処理速度の最適化のためにコンパイルされ、サイズ最適化のためにコンパイルされる関数が少ない場合 (optimize プラグマを使用する場合など)、サイズの最適化のための関数は二重配置を必要とする関数を呼び出す場合に二重配置されます。

関数のすべての呼び出しサイトを識別できる場合、コンパイラは関数に明示的に指定されている呼び出し規約の修飾子を無視し、次のような関数の呼び出し規約の最適化を試みます。

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

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

  • 未使用のパラメーターを削除する

関数が関数ポインターから呼び出される場合、または /GL を指定してコンパイルされたモジュールの外側から関数が呼び出される場合、コンパイラは関数の呼び出し規約を最適化しません。

注意

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

/LTCG モジュールと MSIL モジュール

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

  • /LTCG では、ネイティブ オブジェクト ファイルを使用できます。つまり、/clr を指定してコンパイルされた混在モード (ネイティブ/マネージ) オブジェクト ファイル、/clr:pure を指定してコンパイルされた純粋なオブジェクト ファイル、/clr:safe を指定してコンパイルされた安全なオブジェクト ファイルを使用できます。

  • /LTCG では、安全な .netmodule を使用できます。 .netmodule は、Visual C++ の /clr:safe /LN および他の Visual Studio コンパイラの /target:module を使用して作成できます。 . /clr または /clr:pure を指定して作成された .netmodule は、/LTCG では使用できません。

  • /LTCG:PGI では、/GL および /clr を指定してコンパイルされたネイティブ モジュール、および /clr:pure を指定して生成された純粋なモジュールを使用できません。

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

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

  2. [構成プロパティ] フォルダーをクリックします。

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

  4. [プログラム全体の最適化] プロパティを変更します。

[ビルド] メニューの [ガイド付き最適化のプロファイル] をクリックするか、ソリューション エクスプローラーでプロジェクト名を右クリックし、ガイド付き最適化のプロファイルのいずれかのオプションを選択して、特定のビルドに /LTCG を適用することもできます。

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

参照

参照

リンカー オプションの設定

リンカー オプション