Quando un sistema operativo moderno carica un processo, pre-alloca una certa quantità di spazio per lo stack. Ciò significa che il programmatore deve fare attenzione a evitare l'overflow dello stack limitando la profondità della chiamata e / o aumentando le dimensioni dello stack in fase di esecuzione.
A prima vista, questo sembra inutilmente complicato. Perché il sistema operativo non implementa lo stack di chiamate utilizzando un array dinamico? Quando viene superata la dimensione iniziale (modesta) dell'array, la matrice può essere raddoppiata e riallocata in una nuova posizione sullo heap, garantendo un costo O (1) ammortizzato di push
. In questo modo, il programmatore non dovrà preoccuparsi delle dimensioni dello stack (beh, non più di quanto non debba preoccuparsi della memoria allocata nello heap).
Nell'argomento sopra ho assunto un sistema operativo in modalità reale; ma in realtà tutti i sistemi operativi moderni hanno memoria virtuale. Questo sembra rafforzare solo l'argomentazione per lo stack di dimensioni dinamiche: c'è una memoria virtuale essenzialmente illimitata disponibile per un processo, quindi perché non allocare, ad esempio, un quarto dello spazio del processo come stack? Poiché il processo ha bisogno di più memoria, colpirà le nuove pagine nello spazio virtuale, che genererà automaticamente il mapping alla memoria fisica.