La vita di un oggetto di solito corrisponde ai seguenti meccanismi di allocazione di memoria:
Statica, ovvero la memoria allocata a tempo di compilazione;
Dinamica, ovvero la memoria allocata a run-time.
A loro volta gli oggetti possono essere allocati in due parti diverse della memoria:
Nel maccanismo di allocazione statica un oggetto ha un indirizzo assoluto che è mantenuto per tutta l’esecuzione del programma. Solitamente viene usata per variabili globali, costanti determinabili durante la compilazione o tabelle usate dal supporto a run-time (come il garbage collector). Spesso si usa l’allocazione statica per le aree protette della memoria.
Come abbiamo visto l’allocazione dinamica fa uso sia dello stack che dell’heap. Guardiamo nel dettaglio entrambi i metodi.
La pila viene utilizzata generalmente per gestire i record di attivazione delle funzioni: è la soluzione più congeniale poiché i record di queste chiamate (anche ricorsive) sono annidati l’uno dentro l’altro, in questo modo ogni funzione ha la sua porzione di memoria con le relative informazioni della specifica istanza.
La pila è gestita con:
La memoria dinamica è quella che permette di avere un record di attivazione, poiché è impossibile saperne l’indirizzo a compile-time; mentre è invece possibile, dato lo stack pointer, determinare l’offset e ricavare l’indirizzo in cui si trova il record di attivazione.
Come abbiamo accennato, il record di attivazione è lo spazio della memoria che contiene tutte le informazioni relative necessarie alla funzione in esecuzione. Esso è formato da: