stackalloc (Riferimenti per C#)
La parola chiave stackalloc viene utilizzata in un contesto di codice unsafe per allocare un blocco di memoria nello stack.
int* block = stackalloc int[100];
Note
La parola chiave è valida solo per gli inizializzatori di variabili locali. Il codice seguente causa errori di compilazione.
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];
Poiché vengono utilizzati tipi puntatore, stackalloc richiede un contesto unsafe. Per ulteriori informazioni, vedere Codice unsafe e puntatori (Guida per programmatori C#).
La parola chiave stackalloc è simile a _alloca nella libreria di runtime del linguaggio C.
Nell'esempio riportato di seguito vengono calcolati e visualizzati i primi 20 numeri della sequenza di Fibonacci. Ogni numero corrisponde alla somma dei due numeri precedenti. Nel codice, un blocco di memoria di dimensioni sufficienti a contenere 20 elementi di tipo int viene allocato nello stack, non nell'heap. L'indirizzo del blocco è archiviato nel puntatore fib. Questa memoria non viene sottoposta alla procedura di Garbage Collection e non deve pertanto essere bloccata tramite fixed. La durata del blocco di memoria è limitata alla durata del metodo che lo definisce. Non è possibile liberare la memoria prima della restituzione del metodo.
Esempio
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
*/
Sicurezza
Il codice unsafe è per definizione meno sicuro delle alternative sicure. Tuttavia, l'utilizzo di stackalloc attiva automaticamente le funzionalità di rilevazione del sovraccarico del buffer in Common Language Runtime (CLR). Se viene rilevato un sovraccarico del buffer, il processo viene terminato il più rapidamente possibile per ridurre al minimo la possibilità che venga eseguito codice dannoso.
Specifiche del linguaggio C#
Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.
Vedere anche
Riferimenti
Parole chiave per operatori (Riferimenti per C#)
Codice unsafe e puntatori (Guida per programmatori C#)