stackalloc – operátorC# (Referenční dokumentace)stackalloc operator (C# reference)

Operátor stackalloc přiděluje blok paměti v zásobníku.The stackalloc operator allocates a block of memory on the stack. Blok paměti přidělený zásobníkem, který byl vytvořen během provádění metody, je automaticky zahozen při návratu této metody.A stack allocated memory block created during the method execution is automatically discarded when that method returns. Nelze explicitně uvolnit paměť přidělenou operátorem stackalloc.You cannot explicitly free memory allocated with the stackalloc operator. Blok paměti přidělený zásobníku nepodléhá uvolňování paměti a nemusí být připnutý s příkazemfixed.A stack allocated memory block is not subject to garbage collection and doesn't have to be pinned with a fixed statement.

Výsledek operátoru stackalloc můžete přiřadit proměnné jednoho z následujících typů:You can assign the result of the stackalloc operator to a variable of one of the following types:

  • Počínaje C# 7,2 System.Span<T> nebo System.ReadOnlySpan<T>, jak ukazuje následující příklad: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;
    }
    

    Nemusíte používat nezabezpečený kontext, když přiřadíte blok paměti přidělené zásobníku k proměnné Span<T> nebo 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.

    Při práci s těmito typy můžete použít výraz stackalloc ve výrazech podmíněného nebo přiřazení, jak ukazuje následující příklad: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];
    

    Počínaje C# 8,0 můžete použít výraz stackalloc v jiných výrazech vždy, když je povolena proměnná Span<T> nebo ReadOnlySpan<T>, jak ukazuje následující příklad: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
    

    Poznámka

    Pokud je to možné, doporučujeme používat Span<T> nebo ReadOnlySpan<T> typy pro práci s přidělenou pamětí stacku.We recommend using Span<T> or ReadOnlySpan<T> types to work with stack allocated memory whenever possible.

  • Typ ukazatele, jak ukazuje následující příklad: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 ukazuje předchozí příklad, je nutné při práci s typy ukazatelů použít kontext unsafe.As the preceding example shows, you must use an unsafe context when you work with pointer types.

    V případě typů ukazatelů můžete použít výraz stackalloc pouze v deklaraci lokální proměnné pro inicializaci proměnné.In the case of pointer types, you can use a stackalloc expression only in a local variable declaration to initialize the variable.

Obsah nově přidělené paměti není definován.The content of the newly allocated memory is undefined. Počínaje C# 7,3 můžete použít syntaxi inicializátoru pole k definování obsahu nově přidělené paměti.Beginning with C# 7.3, you can use array initializer syntax to define the content of the newly allocated memory. Následující příklad ukazuje různé způsoby, jak to provést: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 };

Ve výrazu stackalloc T[E]musí být T nespravovaného typu a E musí být výraz typu int.In expression stackalloc T[E], T must be an unmanaged type and E must be an expression of type int.

Zabezpečení –Security

Použití stackalloc v modulu CLR (Common Language Runtime) automaticky povoluje funkce pro detekci přetečení vyrovnávací paměti.The use of stackalloc automatically enables buffer overrun detection features in the common language runtime (CLR). Pokud se zjistí přetečení vyrovnávací paměti, proces se ukončí co nejrychleji, aby se minimalizovala pravděpodobnost spuštění škodlivého kódu.If a buffer overrun is detected, the process is terminated as quickly as possible to minimize the chance that malicious code is executed.

specifikace jazyka C#C# language specification

Další informace naleznete v části alokace zásobníku ve C# specifikaci jazyka a v poznámce k návrhu funkce pro Povolení stackalloc ve vnořených kontextech .For more information, see the Stack allocation section of the C# language specification and the Permit stackalloc in nested contexts feature proposal note.

Viz také:See also