stackalloc (C# リファレンス)
stackalloc キーワードは、unsafe コード コンテキストで、スタックにメモリ ブロックを割り当てるために使用されます。
int* block = stackalloc int[100];
解説
このキーワードは、ローカル変数初期化子でだけ有効です。次のコードはコンパイル エラーになります。
int* block;
// The following assignment statement causes compiler errors. You
// can use stackalloc only when declaring and initializing a local
// variable.
block = stackalloc int[100];
ポインター型が使用されるので、stackalloc は unsafe コンテキストを必要とします。詳細については、「unsafe コードとポインター (C# プログラミング ガイド)」を参照してください。
stackalloc は、C ランタイム ライブラリの _alloca に似ています。
フィボナッチの数列の最初の 20 個の数値を計算して表示するコード例を次に示します。それぞれの数値は、前の 2 つの数値の和になっています。このコードでは、int 型の要素を 20 個保持するのに十分なサイズを持つメモリ ブロックが、ヒープではなくスタックに割り当てられます。割り当てられたブロックのアドレスは、fib ポインターに格納されます。このメモリは、ガベージ コレクションの対象外であるため、fixed を使用して固定する必要はありません。メモリ ブロックの有効期間は、このブロックを定義するメソッドの有効期間に限定されます。メソッドから制御が戻る前にメモリを解放することはできません。
使用例
class Test
{
static unsafe void Main()
{
const int arraySize = 20;
int* fib = stackalloc int[arraySize];
int* p = fib;
// The sequence begins with 1, 1.
*p++ = *p++ = 1;
for (int i = 2; i < arraySize; ++i, ++p)
{
// Sum the previous two numbers.
*p = p[-1] + p[-2];
}
for (int i = 0; i < arraySize; ++i)
{
Console.WriteLine(fib[i]);
}
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/*
Output
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
*/
セキュリティ
アンセーフ コードは、セーフ コードほど安全ではありません。ただし、stackalloc を使用すると、共通言語ランタイム (CLR: Common Language Runtime) のバッファー オーバーラン検出機能が自動的に有効になります。バッファー オーバーランが検出されると、悪意のあるコードが実行される可能性を最小限に抑えるため、プロセスはできる限り迅速に終了されます。
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
参照
関連項目
unsafe コードとポインター (C# プログラミング ガイド)