Concetti Chiave
- Le classi di memorizzazione specificano come il compilatore gestisce l'allocazione di memoria per una variabile.
- Auto è la classe predefinita, allocando variabili locali nello stack che vengono deallocate all'uscita dal blocco.
- Extern estende la visibilità delle variabili oltre il file in cui sono definite, senza allocare memoria fino alla definizione.
- Static mantiene il valore delle variabili tra le chiamate al blocco, riducendo l'uso di variabili globali.
- Register tenta di allocare variabili nei registri della CPU per efficienza, ma è raramente utilizzata oggi.
La classe di memorizzazione (storage class) è un qualificatore che può essere assegnato ad una variabile, per specificare al compilatore come dovrà essere gestita l’allocazione di memoria per quella variabile.
Ci sono quattro possibili classi di memorizzazione:
- auto
- extern
- static
- register
Auto: sta per automatic.
Questa è la classe di default per le variabili: se nella definizione non viene specificata una classe, la variabile è
automatic.
int x; º auto int x;
Le variabili auto sono:
- Locali al blocco in cui sono definite.
- Sono allocate in memoria quando il programma entra nel blocco, deallocate quando ne esce (si pensi alle variabili locali di
una funzione).
Sono memorizzate nello STACK.
- extern: è usata per estendere la visibilità dell’identificatore su cui è usata al di là del file (modulo) in cui si trova.
- Quando il compilatore incontra una dichiarazione extern, controlla l’uso dell’identificatore nel seguito, assumendo che sia definito; il compilatore esporta al linker l’identificatore; sarà il linker a verificare che una effettiva definizione sia data in un file da linkare e a creare il collegamento effettivo tra identificatore e locazione di memoria.
- Definizione
occupa memoria
double f; //è una definizione
- Dicharazione: non occupa memoria
extern double f; //è una dichiarazione
Ogni volta che si vuole usare una variabile definita in un altro file, la si dichiarare extern.
static: le variabili static sono locali al blocco in cui sono definite, ma non vengono deallocate all’uscita dal blocco e
mantengono il proprio valore che è disponibile ad essere riutilizzato non appena l’esecutore entra nel blocco.
- static int inizio = 0; // l’inizializzazione viene fatta solo la 1^ volta
- Se non uso una variabile locale static devo far ricorso ad una variabile globale (questo
però ridurrebbe l’isolamento della funzione in quanto la variabile diverrebbe accessibile da chiunque).
Variabile static:
- locale (tipicamente ad una funzione)
- globale (visibile sono nel file dove è definita)
Variabile static in una funzione ricorsiva:
- se la funzione è chiamata ricorsivamente, ogni istanza della funzione accede alla stessa variabile.
- register: indica al compilatore che, se sarà possibile, la variabile andrà allocata direttamente in uno dei registri della CPU (per motivi di efficienza).
Se nessun registro è disponibile, la variabile viene considerata automatica.
Oggi scarsamente utilizzata: fase di ottimizzazione del compilatore.
Domande da interrogazione
- Qual è la funzione della classe di memorizzazione "auto"?
- Come funziona la classe di memorizzazione "extern"?
- Qual è la differenza tra una variabile "static" e una variabile "register"?
La classe "auto" è la classe di default per le variabili, indicando che sono locali al blocco in cui sono definite e vengono allocate e deallocate in memoria quando il programma entra ed esce dal blocco.
La classe "extern" estende la visibilità di un identificatore oltre il file in cui si trova, permettendo al compilatore di esportare l'identificatore al linker per creare il collegamento tra identificatore e locazione di memoria.
Una variabile "static" mantiene il suo valore tra le chiamate di funzione e non viene deallocata all'uscita dal blocco, mentre una variabile "register" viene allocata in un registro della CPU per efficienza, se possibile, altrimenti è considerata automatica.