Con il termine Stack si intende l’area di memoria destinata a mantenere informazioni sulle funzioni. Lo Stack può essere a sua volta suddiviso in diverse aree di memoria:
- una prima parte destinata a contenere le istruzioni eseguibili del programma stesso (code)
- un’altra area destinata invece a contenere variabili globali, definite al di fuori delle funzioni
- un’area che si occupa dell’allocazione dinamica di oggetti destinati a crescere indefinitivamente (come le reference type) definita HEAP: gli oggetti che vanno qui non hanno una dimensione definita.
Consideriamo un generico programma che parte dalla funzione main per poi andare al gestore evento button click che ha chiamato a sua volta una seconda funzione F(x) la quale ne ha chiamata una terza che indichiamo con G(x): tutte queste chiamate corrispondono ad altrettante zone di memoria riservate nello Stack per ogni funzione: ognuna di esse causa la creazione di un’area relativa alla singola funzione (quest’area
viene detta Stack Frame o Activation Record): nello Stack frame ci sono informazioni tra cui le variabili locali definite all’interno delle singole funzioni (value type), gli eventuali parametri che gli vengono passati e l’indirizzo di ritorno per quando la funzione termina. Supponiamo di essere passati in G(x) che ci riporta in F(x): tutti i dati di G vengono cancellati dallo Stack. Stessa cosa per F quando si ritorna nel Click e così via: possiamo riassumere questo funzionamento mediante l’acronimo LIFO (l’ultimo che entra è anche il primo che esce).
La dimensione dello Stack è pari ad un 1 GB per programmi a 32 bit e 4 GB per 64 bit ma se c’è un eccesso di chiamate si può avere un errore detto Stack Overflow.