stackalloc 運算式 (c # 參考)

運算式會配置 stackalloc 堆疊上的記憶體區塊。 在方法執行期間建立的堆疊配置的記憶體區塊,會在該方法傳回時自動被捨棄。 您無法明確釋放配置給的記憶體 stackalloc 。 堆疊配置的記憶體區塊不受垃圾收集的制約,也不需要使用 fixed 語句釘選。

您可以將運算式的結果指派 stackalloc 給下列其中一種類型的變數:

  • 從 c # 7.2 開始, System.Span<T>System.ReadOnlySpan<T> ,如下列範例所示:

    int length = 3;
    Span<int> numbers = stackalloc int[length];
    for (var i = 0; i < length; i++)
    {
        numbers[i] = i;
    }
    

    當您將堆疊配置的記憶體區塊指派至 Span<T>ReadOnlySpan<T> 變數時,您不需要使用 unsafe 內容。

    當您處理那些類型時,您可以使用條件式或指派運算式中的 stackalloc 運算式,如下列範例所示:

    int length = 1000;
    Span<byte> buffer = length <= 1024 ? stackalloc byte[length] : new byte[length];
    

    從 c # 8.0 開始, stackalloc 只要允許或變數,您就可以在其他運算式內使用運算式 Span<T> ReadOnlySpan<T> ,如下列範例所示:

    Span<int> numbers = stackalloc[] { 1, 2, 3, 4, 5, 6 };
    var ind = numbers.IndexOfAny(stackalloc[] { 2, 4, 6 ,8 });
    Console.WriteLine(ind);  // output: 1
    

    注意

    我們建議盡可能使用 Span<T>ReadOnlySpan<T> 類型來處理堆疊配置的記憶體。

  • 指標類型,如下列範例所示:

    unsafe
    {
        int length = 3;
        int* numbers = stackalloc int[length];
        for (var i = 0; i < length; i++)
        {
            numbers[i] = i;
        }
    }
    

    如先前的範例所示,您在使用指標類型時必須使用 unsafe 內容。

    在指標類型的案例中,您只能 stackalloc 在本機變數宣告中使用運算式來初始化變數。

堆疊上的可用記憶體數量有限。 如果您在堆疊上配置過多的記憶體, StackOverflowException 就會擲回。 若要避免這種情況,請遵循下列規則:

  • 限制您配置的記憶體數量 stackalloc 。 例如,如果預期的緩衝區大小低於特定的限制,您可以在堆疊上配置記憶體;否則,請使用所需長度的陣列,如下列程式碼所示:

    const int MaxStackLimit = 1024;
    Span<byte> buffer = inputLength <= MaxStackLimit ? stackalloc byte[inputLength] : new byte[inputLength];
    

    注意

    由於堆疊上可用的記憶體數量取決於執行程式碼的環境,因此當您定義實際的限制值時,請務必保守。

  • 避免 stackalloc 在迴圈中使用。 在迴圈之外配置記憶體區塊,並在迴圈內重複使用它。

新配置記憶體的內容尚未被定義。 您應該在使用之前將它初始化。 例如,您可以使用 Span<T>.Clear 方法,將所有專案設定為型別的預設值 T

從 c # 7.3 開始,您可以使用陣列初始化運算式語法來定義新配置記憶體的內容。 下列範例示範進行該操作的數種方法:

Span<int> first = stackalloc int[3] { 1, 2, 3 };
Span<int> second = stackalloc int[] { 1, 2, 3 };
ReadOnlySpan<int> third = stackalloc[] { 1, 2, 3 };

在 expression 中 stackalloc T[E]T 必須是 非受控型 別,而且 E 必須評估為非負 整數 值。

安全性

使用 stackalloc 會自動啟用 Common Language Runtime (CLR) 中的緩衝區滿溢偵測功能。 如果偵測到緩衝區滿溢,會盡快終止處理序,將執行惡意程式碼的機會降到最低。

C# 語言規格

如需詳細資訊,請參閱c # 語言規格堆疊配置一節和在嵌套內容 stackalloc 中允許的建議附注。

另請參閱