Le Classi di Memorizzazione

      Nessun commento su Le Classi di Memorizzazione
Tutte le variabili che dichiariamo in un programma scritto in C, possono presentare fondamentalmente tre proprietà:

  • Durata di memorizzazione: essa determina quando la memoria viene riservata per quella variabile e quando può essere rilasciata. Una variabile con durata di memorizzazione automatica, ha dello spazio che viene allocato quando il blocco di istruzioni circostanti viene eseguito. Quando il blocco ha termine, questo spazio viene deallocato e quella variabile perde il valore che aveva. Invece, una variabile che ha una durata di memorizzazione statica, permane nella stessa locazione di memoria per tutto il programma, permettendo dunque che il suo valore venga mantenuto in modo permanente.
  • Scope: lo scope di una variabile in un programma C è quella porzione di codice, all’interno della quale si può fare riferimento alla variabile stessa. Una variabile può avere due tipi di scope: SCOPE DI BLOCCO: la variabile è visibile dal punto della sua dichiarazione fino alla fine del blocco e SCOPE DI FILE: la variabile è visibile dal punto della sua dichiarazione, fino alla fine del file che la contiene.
  • Linkage o Collegamento: Il linkage di una variabile, determina l’estensione della quale questa possa essere condivisa tra differenti parti del programma. Esistono tre tipi di collegamento: COLLEGAMENTO ESTERNO: una variabile con questo tipo di collegamento può essere condivisa tra tutti i file del programa. COLLEGAMENTO INTERNO: una variabile con collegamento interno può essere condivisa da tutte le funzioni che sono contenute in quello specifico file. SENZA COLLEGAMENTO: una variabile senza collegamento appartiene a una singola funzione e non può essere condivisa con altri file.

Ma in un programma C possiamo essere anche noi a dichiarare la classe di memorizzazione di una variabile:

CLASSI DI MEMORIZZAZIONE

Abbiamo 4 classi di memorizzazione in un programma C:

  1. CLASSE DI MEMORIZZAZIONE “AUTO”: Questa classe di memorizzazione è consentita solo per le variabili che appartengono a un blocco. Una variabile con questo tipo di classe ha durata di memorizzazione automatica, scope di blocco ed è no linkage, cioè senza collegamento. Questo tipo di classe, di solito, non viene specificato perché è la situazione di default per tutte le variabili.
  2. CLASSE DI MEMORIZZAZIONE “STATIC”: E’ una classe che può essere usata con tutte le variabili. Però, se viene applicata a variabili al di fuori di un blocco di istruzioni, specifica che la variabile, ha un collegamento interno. Quando invece viene usata all’interno di un blocco, la classe static modificherà la durata di memorizzazione, da automatica a statica. Può essere usata anche per aumentare l’efficienza dei programmi.
  3. CLASSE DI MEMORIZZAZIONE “EXTERN”: Questa classe di memorizzazione permette di condividere una stessa variabile tra diversi file sorgenti. Molto importante: se ad esempio scrivo extern int i; questo informa il compilatore che i è una variabile di tipo intero, ma non comporta l’allocazione della memoria per contenere quella variabile. In questo modo io sto solo dicendo al compilatore, che deve accedere a quella variabile, che però è stata definita altrove, in un altro file o in un punto successivo del programma. Una variabile può essere dichiarata più volte in un programma, ma può avere soltanto una definizione. C’è un unica eccezione però: le dichiarazioni extern, non sono delle definizioni di variabile. Una dichiarazione extern che inizializzi una variabile funge già da definizione della variabile stessa! ESEMPIO: extern int i=0; è equivalente a: int i=0; Questa scrittura si previene che più dichiarazioni extern inizializzino una variabile in modo differente.
  4. CLASSE DI MEMORIZZAZIONE “REGISTER”: Usare questo tipo di memorizzazione significa che stiamo dicendo al nostro compilatore, di memorizzare una determinata variabile nei registri della CPU, invece di memorizzarla nella memoria principale (RAM). Ricordiamo brevemente, che un registro è un’area di memoria collocata all’interno del processore del computer. I dati contenuti in un registro sono aggiornabili e accessibili molto più velocemente rispetto a quelli contenuti nella memoria RAM. La classe di memorizzazione register è ammessa però, soltanto per le variabili dichiarate all’interno di un blocco. Inoltre le variabili memorizzare nei registri del processore, differiscono da quelle automatiche per una cosa: i registri non possiedono un indirizzo e dunque non è possibile usare l’operatore & per ottenere l’indirizzo. E’ molto utile usare questa classe di memorizzazione per variabili che vengono aggiornate di frequente. ESEMPIO DI DICHIARAZIONE: register int i;