Оператор stackalloc (Справочник по C#)stackalloc operator (C# reference)

Оператор stackalloc выделяет блок памяти в стеке.The stackalloc operator allocates a block of memory on the stack. Выделенный в стеке блок памяти, который создает этот метод, автоматически удаляется по завершении выполнения метода.A stack allocated memory block created during the method execution is automatically discarded when that method returns. Вы не можете явным образом освободить память, выделенную оператором stackalloc.You cannot explicitly free memory allocated with the stackalloc operator. Выделенный в стеке блок памяти не подвергается сборке мусора, а значит, ее не нужно закреплять с помощью инструкции fixed.A stack allocated memory block is not subject to garbage collection and doesn't have to be pinned with the fixed statement.

В выражении stackalloc T[E] элемент T должен быть неуправляемым типом, а элемент E — выражением типа int.In expression stackalloc T[E], T must be an unmanaged type and E must be an expression of type int.

Результат выполнения оператора stackalloc вы можете присвоить переменной любого из следующих типов:You can assign the result of the stackalloc operator to a variable of one of the following types:

  • Начиная с C# 7.2, System.Span<T> или System.ReadOnlySpan<T>, как показано в следующем примере:Starting with C# 7.2, System.Span<T> or System.ReadOnlySpan<T>, as the following example shows:

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

    Нет необходимости использовать небезопасный контекст при назначении выделенного в стеке блока памяти переменной Span<T> или ReadOnlySpan<T>.You don't have to use an unsafe context when you assign a stack allocated memory block to a Span<T> or ReadOnlySpan<T> variable.

    При работе с такими типами вы можете использовать выражение stackalloc в условном выражении или выражении присваивания, как показано в следующем примере:When you work with those types, you can use a stackalloc expression in conditional or assignment expressions, as the following example shows:

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

    Примечание

    Мы рекомендуем везде, где это возможно, использовать для работы с выделенной в стеке памятью типы Span<T> или ReadOnlySpan<T>.We recommend using Span<T> or ReadOnlySpan<T> types to work with stack allocated memory whenever possible.

  • Тип указателя, как показано в следующем примере.A pointer type, as the following example shows:

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

    Как демонстрирует пример выше, при работе с типами указателей необходимо использовать контекст unsafe.As the preceding example shows, you must use an unsafe context when you work with pointer types.

Содержимое только что выделенной памяти не определено.The content of the newly allocated memory is undefined. Начиная с C# 7.3, вы можете использовать синтаксис инициализатора массива, чтобы определить содержимое для только что выделенной памяти.Starting with C# 7.3, you can use array initializer syntax to define the content of the newly allocated memory. В следующем примере показано несколько способов сделать это:The following example demonstrates various ways to do that:

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

БезопасностьSecurity

При использовании stackalloc в среде CLR автоматически включается контроль переполнения буфера.The use of stackalloc automatically enables buffer overrun detection features in the common language runtime (CLR). Если буфер переполнен, процесс незамедлительно прерывается — это позволяет минимизировать риск исполнения вредоносного кода.If a buffer overrun is detected, the process is terminated as quickly as possible to minimize the chance that malicious code is executed.

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

Дополнительные сведения см. в разделе Stack allocation (Выделение памяти в стеке) из спецификации языка C#.For more information, see the Stack allocation section of the C# language specification.

См. такжеSee also