/Gs (コントロール スタック チェックの呼び出し)

スタック プローブのしきい値を制御します。

構文

/Gs[size]

引数

size
(オプション) スタック プローブが開始される前にローカル変数が占有することのできるバイト数。 /Gssizeの間に空白は使用できません。

解説

"スタック プローブ" とは、コンパイラが関数呼び出しの開始時に挿入するコードのシーケンスのことです。 開始されると、スタック プローブは、関数のローカル変数を格納するために必要な領域の量によってメモリに無害に到達します。 このプローブにより、オペレーティング システムは、必要に応じて、関数の残りの部分を実行する前に、より多くのスタック メモリを透過的にページングします。

既定で、関数に 1 ページを超えるスタック領域が必要な場合、コンパイラはスタック プローブを開始するコードを生成します。 この既定値は、x86、x64、ARM、ARM64 プラットフォームの /Gs4096 のコンパイラ オプションと同じです。 この値により、アプリケーションと Windows メモリ マネージャーは、実行時に動的にプログラム スタックにコミットされるメモリの量を増やすことができます。

Note

/Gs4096の既定値を使用すると、Windows 用アプリケーションのプログラム スタックを実行時に正しく拡張できます。 既定値は、変更理由が明確でない限り変えないことをお勧めします。

一部のプログラム (仮想デバイス ドライバーなど) では、この既定のスタック拡張メカニズムは必要ありません。 このような場合、スタック プローブは必要なく、ローカル変数ストレージに必要な関数よりも大きい値に size を設定することで、コンパイラによる生成を停止できます。

/Gs0 は、ローカル変数のストレージを必要とするすべての関数呼び出しに対してスタック プローブを開始します。 この値は、パフォーマンスに悪影響を与える可能性があります。

x64 ターゲットの場合、size引数を指定せずに /Gs オプションを指定した場合、/Gs0と同じです。 size引数が 1 から 9 の場合、コンパイラは警告 D9014 を出力し、効果は /Gs0 を指定する場合と同じです。

x86、ARM、ARM64 ターゲットの場合、size引数を指定しない/Gs オプションは、/Gs4096と同じです。 size引数が 1 から 9 の場合、コンパイラは警告 D9014 を出力し、効果は /Gs4096 を指定する場合と同じです。

すべてのターゲットに対して、10 から 2147483647 までの size 引数によって、指定した値にしきい値が設定されます。 2147483648以上の size が発生すると、致命的なエラー C1049 が発生します。

check_stack ディレクティブを使用して、スタック プローブのオンとオフを切り替えることができます。 /Gscheck_stackプラグマは標準の C ライブラリ ルーチンには影響しません。コンパイルする関数にのみ影響します。

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

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  3. [追加のオプション]/Gs コンパイラ オプションと省略可能なサイズを入力します。 [OK] または [適用] を選択して、変更内容を保存します。

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

関連項目

MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文