stackalloc (Referencia de C#)
Actualización: noviembre 2007
La palabra clave stackalloc se utiliza en un contexto de código no seguro para asignar un bloque de memoria en la pila.
int* fib = stackalloc int[100];
Comentarios
El ejemplo siguiente aplica la secuencia de Fibonacci a 100 números; 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 100 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 reciclaje 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.
El operador stackalloc sólo es válido en inicializadores de variables locales.
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 en tiempo de ejecución de C.
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.
Ejemplo
class Test
{
static unsafe void Main()
{
const int arraySize = 20;
int* fib = stackalloc int[arraySize];
int* p = fib;
*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 - 1; ++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
*/
Especificación del lenguaje C#
Para obtener más información, vea la siguiente sección de Especificación del lenguaje C#.
- 18.8 Asignación de la pila
Vea también
Conceptos
Referencia
Palabras clave de operadores (Referencia de C#)
Código no seguro y punteros (Guía de programación de C#)