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# の構文と使用法に関する信頼性のある情報源です。

参照

参照

C# のキーワード

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

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

概念

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

その他の技術情報

C# リファレンス