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