stackalloc (C# リファレンス)
更新 : 2007 年 11 月
stackalloc キーワードは、unsafe コード コンテキストで、スタックにメモリ ブロックを割り当てるために使用されます。
int* fib = stackalloc int[100];
解説
フィボナッチ数列の値を 100 個出力する例を次に示します。各数値は、前の 2 つの数値の合計です。このコードでは、int 型の要素を 100 個保持するのに十分なサイズを持つメモリ ブロックが、ヒープではなくスタックに割り当てられます。割り当てられたブロックのアドレスは、fib ポインタに格納されます。このメモリは、ガベージ コレクションの対象外であるため、fixed を使用して固定する必要はありません。メモリ ブロックの有効期間は、このブロックを定義するメソッドの有効期間に限定されます。メソッドから制御が戻る前にメモリを解放することはできません。
stackalloc は、ローカル変数初期化子でだけ有効です。
ポインタ型が使用されるので、stackalloc は unsafe コンテキストを必要とします。詳細については、「unsafe コードとポインタ (C# プログラミング ガイド)」を参照してください。
stackalloc は、C ランタイム ライブラリの _alloca に似ています。
セキュリティ
アンセーフ コードは、セーフ コードほど安全ではありません。ただし、stackalloc を使用すると、共通言語ランタイム (CLR: Common Language Runtime) のバッファ オーバーラン検出機能が自動的に有効になります。バッファ オーバーランが検出されると、悪意のあるコードが実行される可能性を最小限に抑えるため、プロセスはできる限り迅速に終了されます。
使用例
class Test
{
static unsafe void Main()
{
const int arraySize = 20;
int* fib = stackalloc int[arraySize];
int* p = fib;
*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 - 1; ++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
*/
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
- 18.8 スタック割り当て
参照
概念
参照
unsafe コードとポインタ (C# プログラミング ガイド)