Operador stackalloc (referencia de C#)stackalloc operator (C# reference)

El operador stackalloc asigna un bloque de memoria en la pila.The stackalloc operator allocates a block of memory on the stack. Un bloque de memoria asignado a la pila creado durante la ejecución del método se descarta automáticamente cuando se devuelva dicho método.A stack allocated memory block created during the method execution is automatically discarded when that method returns. No puede liberar explícitamente memoria asignada con el operador stackalloc.You cannot explicitly free memory allocated with the stackalloc operator. Un bloque de memoria asignada a la pila no está sujeto a recolección de elementos no utilizados y no tiene que fijarse con la instrucción fixed.A stack allocated memory block is not subject to garbage collection and doesn't have to be pinned with the fixed statement.

En la expresión stackalloc T[E], T debe ser un tipo no administrado y E debe ser una expresión de tipo int.In expression stackalloc T[E], T must be an unmanaged type and E must be an expression of type int.

Puede asignar el resultado del operador stackalloc a una variable de uno de los siguientes tipos:You can assign the result of the stackalloc operator to a variable of one of the following types:

  • A partir de C# 7.2, System.Span<T> o System.ReadOnlySpan<T>, como se muestra en el ejemplo siguiente: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;
    }
    

    No tiene que usar un contexto unsafe al asignar un bloque de memoria asignado a la pila para una variable Span<T> o 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.

    Cuando se trabaja con esos tipos, puede usar una expresión stackalloc en expresiones condicionales o de asignación, como se muestra en el ejemplo siguiente: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];
    

    A partir de C# 8.0, se puede usar una expresión stackalloc dentro de otras expresiones siempre que se permita una variable Span<T> o ReadOnlySpan<T>, como se muestra en este ejemplo:Starting 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
    

    Nota

    Se recomienda usar los tipos Span<T> o ReadOnlySpan<T> para trabajar con memoria asignada a la pila siempre que sea posible.We recommend using Span<T> or ReadOnlySpan<T> types to work with stack allocated memory whenever possible.

  • Un tipo de puntero, como se muestra en el ejemplo siguiente: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;
        }
    }
    

    Como se muestra en el ejemplo anterior, se debe utilizar un contexto unsafe cuando se trabaja con tipos de puntero.As the preceding example shows, you must use an unsafe context when you work with pointer types.

    En el caso de los tipos de puntero, solo se puede usar una expresión stackalloc en una declaración de variable local para inicializar la variable.In the case of pointer types, you can use a stackalloc expression only in a local variable declaration to initialize the variable.

El contenido de la memoria recién asignada está sin definir.The content of the newly allocated memory is undefined. A partir de C# 7.3, puede usar la sintaxis de inicializador de matriz para definir el contenido de la memoria recién asignada.Starting with C# 7.3, you can use array initializer syntax to define the content of the newly allocated memory. En el ejemplo siguiente se muestran diversas formas de hacerlo: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 };

SeguridadSecurity

El uso de stackalloc habilita automáticamente las características de detección de saturación del búfer en el entorno Common Language Runtime (CLR).The use of stackalloc automatically enables buffer overrun detection features in the common language runtime (CLR). Si se detecta saturación del búfer, se finaliza el proceso lo antes posible para minimizar el riesgo de que se ejecute código malintencionado.If a buffer overrun is detected, the process is terminated as quickly as possible to minimize the chance that malicious code is executed.

Especificación del lenguaje C#C# language specification

Para obtener más información, vea la sección sobre asignación de pila de la especificación del lenguaje C#.For more information, see the Stack allocation section of the C# language specification.

Vea tambiénSee also