stackalloc (Referencia de C#)
La palabra clave stackalloc se utiliza en un contexto de código no seguro para asignar un bloque de memoria en la pila.
int* block = stackalloc int[100];
Comentarios
La palabra clave solo es válida en inicializadores de variable locales. El siguiente código provoca errores de compilación.
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];
Dado que intervienen los tipos de puntero, stackalloc requiere el contexto unsafe. Para obtener más información, vea Código no seguro y punteros (Guía de programación de C#).
stackalloc es como _alloca en la biblioteca de tiempo de ejecución C.
En el ejemplo siguiente se calculan y se muestran los primeros 20 números de la secuencia de Fibonacci. Cada número es la suma de los dos números anteriores. En el código, un bloque de memoria de tamaño suficiente para contener 20 elementos de tipo int se asigna en la pila y no en el montón. La dirección del bloque se almacena en el puntero fib. Esta memoria no está sometida a la recolección de elementos no utilizados y, por lo tanto, no necesita anclarse (mediante el uso de fixed). La duración del bloque de memoria se limita a la duración del método que lo define. No hay forma de liberar la memoria antes de la devolución del método.
Ejemplo
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
*/
Seguridad
El código no seguro es menos seguro que las alternativas seguras. Sin embargo, el uso de stackalloc habilita automáticamente las características de detección de saturación del búfer en Common Language Runtime (CLR). Si se detecta una saturación del búfer, el proceso se finaliza tan rápidamente como sea posible para reducir la oportunidad de que se ejecute código malintencionado.
Especificación del lenguaje C#
Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.
Vea también
Referencia
Palabras clave de operadores (Referencia de C#)
Código no seguro y punteros (Guía de programación de C#)