Condividi tramite


stackalloc (Riferimenti per C#)

Aggiornamento: novembre 2007

La parola chiave stackalloc viene utilizzata in un contesto di codice unsafe per allocare un blocco di memoria nello stack.

int* fib = stackalloc int[100];

Note

Nell'esempio seguente viene restituita la sequenza di Fibonacci fino a 100 numeri, in cui ogni numero è la somma dei due numeri precedenti. Nel codice, un blocco di memoria di dimensioni sufficienti a contenere 100 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.

La parola chiave stackalloc è valida solo per gli inizializzatori di variabili locali.

Poiché vengono utilizzati tipi puntatore, stackalloc richiede un contesto unsafe. Per ulteriori informazioni, vedere la classe Codice unsafe e puntatori (Guida per programmatori C#).

La parola chiave stackalloc è simile a _alloca nella libreria di runtime del linguaggio C.

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.

Esempio

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
*/

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere la seguente sezione inclusa in Specifiche del linguaggio C#:

  • 18.8 Allocazione nello stack

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Parole chiave di C#

Parole chiave per operatori (Riferimenti per C#)

Codice unsafe e puntatori (Guida per programmatori C#)

Altre risorse

Riferimenti per C#