Esporta (0) Stampa
Espandi tutto

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];

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.

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.

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


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

  • 18.8 Allocazione nello stack

Aggiunte alla community

AGGIUNGI
Mostra:
© 2014 Microsoft