stackalloc — operatorC# (odwołanie)stackalloc operator (C# reference)

Operator stackalloc przydziela blok pamięci na stosie.The stackalloc operator allocates a block of memory on the stack. Blok pamięci przydzielony przez stos utworzony podczas wykonywania metody jest automatycznie usuwany, gdy ta metoda zwraca.A stack allocated memory block created during the method execution is automatically discarded when that method returns. Nie można jawnie zwolnić pamięci przydzieloną za pomocą operatora stackalloc.You cannot explicitly free memory allocated with the stackalloc operator. Przydzielony blok pamięci stosu nie podlega wyrzucaniu elementów bezużytecznych i nie musi być przypięty za pomocą instrukcjifixed.A stack allocated memory block is not subject to garbage collection and doesn't have to be pinned with a fixed statement.

W stackalloc T[E]Expression T musi być typem niezarządzanym , a E musi być wyrażeniem typu int.In expression stackalloc T[E], T must be an unmanaged type and E must be an expression of type int.

Wynik operatora stackalloc można przypisać do zmiennej jednego z następujących typów:You can assign the result of the stackalloc operator to a variable of one of the following types:

  • Począwszy od C# 7,2, System.Span<T>lubSystem.ReadOnlySpan<T>, jak pokazano na poniższym przykładzie:Beginning 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;
    }
    

    Nie trzeba używać niebezpiecznego kontekstu, gdy przypiszesz blok pamięci przydzielony przez stos do zmiennej Span<T> lub 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.

    Podczas pracy z tymi typami można użyć wyrażenia stackalloc w wyrażeniach warunkowych lub przypisywania, jak pokazano w poniższym przykładzie: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];
    

    Począwszy od C# 8,0, można użyć wyrażeniastackallocw innych wyrażeniach za każdym razem, gdy zmiennaSpan<T>lubReadOnlySpan<T>jest dozwolona, jak pokazano na poniższym przykładzie:Beginning with C# 8.0, you can use a stackalloc expression inside other expressions whenever a Span<T> or ReadOnlySpan<T> variable is allowed, as the following example shows:

    Span<int> numbers = stackalloc[] { 1, 2, 3, 4, 5, 6 };
    var ind = numbers.IndexOfAny(stackalloc[] { 2, 4, 6 ,8 });
    Console.WriteLine(ind);  // output: 1
    

    Uwaga

    Zaleca się używanie typów Span<T> lub ReadOnlySpan<T> do pracy z przydzieloną pamięcią, jeśli to możliwe.We recommend using Span<T> or ReadOnlySpan<T> types to work with stack allocated memory whenever possible.

  • Typ wskaźnika, jak pokazano na poniższym przykładzie: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;
        }
    }
    

    Jak pokazano w powyższym przykładzie, należy użyć kontekstu unsafe podczas pracy z typami wskaźników.As the preceding example shows, you must use an unsafe context when you work with pointer types.

    W przypadku typów wskaźnika można użyć wyrażenia stackalloc tylko w deklaracji zmiennej lokalnej, aby zainicjować zmienną.In the case of pointer types, you can use a stackalloc expression only in a local variable declaration to initialize the variable.

Zawartość nowo przydzieloną pamięci jest niezdefiniowana.The content of the newly allocated memory is undefined. Począwszy od C# 7,3, można użyć składni inicjatora tablicy do zdefiniowania zawartości nowo przydzieloną pamięć.Beginning with C# 7.3, you can use array initializer syntax to define the content of the newly allocated memory. Poniższy przykład ilustruje różne sposoby, aby to zrobić: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 };

ZabezpieczeniaSecurity

Użycie stackalloc powoduje automatyczne włączenie funkcji wykrywania przepełnienia buforu w środowisku uruchomieniowym języka wspólnego (CLR).The use of stackalloc automatically enables buffer overrun detection features in the common language runtime (CLR). Jeśli wykryto przepełnienie buforu, proces zostaje zakończony jak najszybciej, aby zminimalizować prawdopodobieństwo wykonania złośliwego kodu.If a buffer overrun is detected, the process is terminated as quickly as possible to minimize the chance that malicious code is executed.

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz sekcję Alokacja stosu w C# specyfikacji języka.For more information, see the Stack allocation section of the C# language specification.

Zobacz takżeSee also