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];
因為牽涉到指標型別 (Pointer Type),stackalloc 需要 unsafe 內容。如需詳細資訊,請參閱 Unsafe 程式碼和指標 (C# 程式設計手冊)。
stackalloc 的功用與 C 執行階段程式庫中的 _alloca 相似。
下列範例會計算並顯示 Fibonacci 序列中的前 20 個數字。每個數字都是前兩個數字的總和。在程式碼中,足以容納 20 個 int 型別之項目的記憶體區塊會配置在堆疊上,而不是堆積中。該區塊的位址會儲存於指標 fib 中。這個記憶體不會進行記憶體回收,因此不須使用 fixed 將記憶體固定住。記憶體區塊的存留期 (Lifetime) 受限於定義該區塊之方法的存留期。方法傳回之前,您無法釋放記憶體。
範例
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
*/
安全性
Unsafe 程式碼的安全性不如 Safe 程式碼。然而,使用 stackalloc 會自動啟用 Common Language Runtime (CLR) 的緩衝區滿溢偵測功能。如果偵測到緩衝區滿溢,就會儘速中斷處理序,將執行惡意程式碼的機會降到最低。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格。語言規格是 C# 語法和用法的限定來源。