Con qualunque linguaggio si programmi, quando viene avviato un programma viene occupata una parte della memoria della macchina. Questa quantità di memoria occupata in realtà è suddivisa in tante piccole sottosezioni:
- Una di queste è formata dalle istruzioni eseguibili, code;
- Un’altra area della memoria contiene le variabili globali;
- Un’altra area, tendenzialmente la più ampia, è occupata dalle variabili che non hanno una dimensione prestabilita, ma possono crescere “all’infinito”, o almeno fino a quando non viene esaurita tutta la memoria della macchina. In questa area di memoria troviamo quindi i reference type, come ad esempio StrigBuilder, e le classi, cioè tutte quegli oggetti che richiedono una allocazione dinamica; quest’area di memoria è detta heap;
- Infine, l’ultima area, è detta stack; qui si trovano le strutture e i tipi value type. La stack può quindi essere definita come l’area di memoria destinata alle function.
Nello stack, ogni chiamata funzionale alloca un’area della memoria dello stack; per ogni chiamata dei genera uno stack frame (o activation record), cioè una porzione di memoria dello stack. All’interno di uno stack frame troviamo: le variabili locali della funzione (incluse le variabili restituite), gli eventuali parametri e l’indirizzo di ritorno della funzione. Via via che ci sono chiamate funzionali, lo stack cresce, aggiungendo le nuove chiamate in cima a quelle già presenti. Quando una chiamata è “terminata”, viene rimossa, fino a quando viene rimosso anche la chiamata di base, cioè il Main(), al momento della chiusura del programma. Possiamo perciò affermare, per quanto detto, che lo stack segue la metodologia “LAST IN- FIRST OUT (LIFO)”, cioè l’ultimo elemento che entra nell’insieme, sarà anche il primo ad uscirne. Le dimensione dello stack sono molto ampie, infatti per programmi a 32 bit lo stack può occupare fino a 1GB di memoria, mentre per programmi a 64bit può arrivare a 4GB. Se il programma eccede queste dimensioni, si genera uno stack overflow, cosa non troppo rara quando si utilizzano le strutture ricorsive.
