Поделиться через


stackalloc (Справочник по C#)

Ключевое слово stackalloc используется в небезопасном контексте кода для выделения блока памяти в стеке.

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. Дополнительные сведения см. в разделе Небезопасный код и указатели (Руководство по программированию в C#).

stackalloc аналогично _alloca в библиотеке времени выполнения языка C.

В следующем примере вычисляет и отображает первые 20 числа в последовательности Фибоначчи. Каждое число является суммой предыдущих двух чисел. В коде показан блок памяти, имеющий достаточный размер для хранения 20 элементов типа int и выделенный в стеке, а не в куче. Адрес блока хранится в указателе 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 автоматически активируются функции обнаружения переполнения буфера. В случае обнаружения переполнения происходит максимально быстрое завершение процесса, которое сокращает вероятность выполнения вредоносного кода.

Спецификация языка C#

Дополнительные сведения см. в Спецификация языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

Ссылки

Ключевые слова C#

Ключевые слова операторов (Справочник по C#)

Небезопасный код и указатели (Руководство по программированию в C#)

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Справочник по C#