Concetti Chiave

  • La classe di memorizzazione specifica come il compilatore gestisce l'allocazione della memoria per le variabili.
  • Le quattro classi di memorizzazione sono auto, extern, static e register, ciascuna con caratteristiche distintive.
  • Le variabili di classe auto sono locali al loro blocco e allocate nello STACK, vengono deallocate all'uscita dal blocco.
  • Le variabili static mantengono il loro valore tra le chiamate alla funzione, a differenza delle variabili automatiche che vengono deallocate.
  • La classe register richiede al compilatore di allocare la variabile in un registro della CPU per migliorare l'efficienza, se possibile.

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

Dettagli sulla classe auto

Auto: sta per automatic.

Questa è la classe di default per le variabili: se nella definizione non viene specificata una classe, la variabile è

automatic.

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.

Caratteristiche delle variabili static

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

  1. Qual è la classe di memorizzazione di default per le variabili in C?
  2. La classe di memorizzazione di default è "auto", che indica che le variabili sono locali al blocco in cui sono definite e vengono allocate in memoria all'ingresso nel blocco e deallocate all'uscita (come specificato nel testo).

  3. Qual è la differenza tra dichiarazione e definizione di una variabile extern?
  4. La dichiarazione di una variabile extern non occupa memoria (es. `extern double f;`), mentre la definizione occupa memoria (es. `double f;`). La dichiarazione serve per estendere la visibilità dell'identificatore oltre il file in cui è definito (come indicato nel testo).

  5. Quali sono le caratteristiche delle variabili static in C?
  6. Le variabili static sono locali al blocco in cui sono definite, ma non vengono deallocate all'uscita dal blocco e mantengono il loro valore per essere riutilizzate. Possono essere locali a una funzione o globali, ma visibili solo nel file dove sono definite (come descritto nel testo).

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community