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 スタック割り当て

参照

概念

C# プログラミング ガイド

参照

C# のキーワード

演算子キーワード (C# リファレンス)

unsafe コードとポインタ (C# プログラミング ガイド)

その他の技術情報

C# リファレンス