stackalloc (Справочник по C#)
Обновлен: Ноябрь 2007
Ключевое слово stackalloc используется в небезопасном контексте кода для выделения блока памяти в стеке.
int* fib = stackalloc int[100];
Заметки
Результатом следующего примера является последовательность чисел Фибоначчи до 100, в которой каждое число является суммой предыдущих двух чисел. В коде показан блок памяти, имеющий достаточный размер для хранения 100 элементов типа int и выделенный в стеке, а не в куче. Адрес блока хранится в указателе fib. Сборка мусора не затрагивает память и поэтому память не должна быть закреплена (с помощью fixed). Время существования блока памяти ограничено жизненным циклом определяющего его метода. Перед возвращением метода освободить память нельзя.
Переменная stackalloc является допустимой только в инициализаторах локальных переменных.
В связи с использованием типов указателей для stackalloc требуется небезопасный контекст. Дополнительные сведения см. в разделе Небезопасный код и указатели (Руководство по программированию в C#).
stackalloc аналогично _alloca в библиотеке времени выполнения языка C.
Безопасность
Небезопасный код менее надежен, чем его защищенные альтернативы. Однако при использовании stackalloc в 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 Выделение стека
См. также
Основные понятия
Руководство по программированию в C#
Ссылки
Ключевые слова операторов (справочник по C#)
Небезопасный код и указатели (Руководство по программированию в C#)