nikpez di nikpez
Ominide 738 punti

Classi di memorizzazione delle variabili

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.

Registrati via email