Anno accademico 2010-2011 1 Le classi di memorizzazione.

23
Anno accademico 2010-2011 Anno accademico 2010-2011 1 Le classi di Le classi di memorizzazione memorizzazione

Transcript of Anno accademico 2010-2011 1 Le classi di memorizzazione.

Page 1: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

11

Le classi di memorizzazioneLe classi di memorizzazione

Page 2: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

22

SommarioSommario

• Le classi di memorizzazioneLe classi di memorizzazione Durata fissa e durata automaticaDurata fissa e durata automatica L’ambito di visibilitàL’ambito di visibilità

Page 3: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Nel linguaggio C, viene offerta la possibilità di condividere variabili e di delimitare le porzioni di codice che sfruttano tali condivisioni, mediante la definizione dell’ambito di visibilitàambito di visibilità, o scopescope, delle variabili

• L’ambito di visibilità è il termine tecnico che denota la L’ambito di visibilità è il termine tecnico che denota la parte del testo sorgente C in cui è attiva la parte del testo sorgente C in cui è attiva la dichiarazione di un nomedichiarazione di un nome

• Inoltre, le variabili hanno una duratadurata, che descrive il lasso temporale di memorizzazione dei valori di una variabile: Nel caso di variabili con durata fissadurata fissa, i valori memorizzati

vengono mantenuti anche all’esterno dell’ambito di visibilità

• Le proprietà di visibilità e di durata individuano la classe classe di memorizzazionedi memorizzazione di una variabile

Introduzione Introduzione 1 1

33

Page 4: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• La variabile jj ha durata automaticadurata automatica, mentre arar ha durata durata fissafissa, perché dichiarata staticstatic: A jj viene automaticamente allocata memoria ogni volta che

viene eseguito il blocco che la contiene (può avere indirizzi diversi per esecuzioni diverse del blocco di codice)

arar viene allocato la prima volta che viene eseguito il blocco e mantiene l’indirizzo originale per l’intera esecuzione del programma

void func(){ int j; static int ar[]{1,2,3,4} … … … }

• Le variabili jj ed arar hanno entrambe visibilità a livello di visibilità a livello di bloccoblocco, perché definite all’interno di un blocco: pos-sono essere referenziate solo dalle istruzioni che appartengono al blocco (il corpo della funzione func()func())

• Le variabili jj ed arar sono dette localilocali

EsempioEsempio

44

Introduzione Introduzione 2 2

Page 5: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Le variabili con durata fissadurata fissa sono permanenti, mentre le variabili con durata automaticadurata automatica sono allocate più volte durante l’esecuzione del programma

Ad una variabile fissa viene associata una locazione di memoria all’inizio del programma, che non cambia fino al termine dello stesso

Ad una variabile automatica viene allocata memoria ogni volta che si entra nel suo ambito di visibilità; se il codice che appartiene all’ambito di visibilità della variabile viene rieseguito, la variabile viene generalmente allocata altrove: non si mantiene il valore della variabile fra due esecuzioni successive

55

Durata fissa e durata automatica Durata fissa e durata automatica 1 1

Page 6: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Le variabili locali sono automatiche per default, ma possono essere rese fisse se dichiarate staticstatic

• La parola chiave autoauto definisce esplicitamente una variabile automatica, ma è usata raramente perché ridondante

66

Durata fissa e durata automatica Durata fissa e durata automatica 2 2

Page 7: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

void increment()

{

int j1; static int k1;

j; k; printf(“j: %d\t k: %d\n”, j, k);

}

main()

{

increment();

increment();

increment();

}

La funzione increment()increment() incre-menta i valori delle variabili jj e kk, entrambe inizializzate a 1

Il risultato dell’esecuzione del pro-gramma è:

j: 2j: 2 k: 2k: 2

j: 2j: 2 k: 3k: 3

j: 2j: 2 k: 4k: 4

• Le variabili fisse vengono inizializzate una sola volta, mentre quelle automatiche vengono inizializzate ogni volta che viene eseguito il blocco che le contiene

77

L’inizializzazione delle variabili L’inizializzazione delle variabili 11

Page 8: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Le variabili fisse vengono inizializzate di default al valore zero, quelle automatiche non vengono inizializzate (e sono normalmente allocate sullo stackstack)

• Le variabili scalari automatiche possono essere inizializzate con una qualunque espressione, con il solo vincolo che tutte le variabili contenute nell’espressione siano state dichiarate (e inizializzate) in precedenza

• Le variabili con durata fissa possono essere inizializzate solo per mezzo di espressioni costanti, ossia non contenenti nomi di variabili

88

L’inizializzazione delle variabili L’inizializzazione delle variabili 22

Page 9: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Le variabili con durata fissa sono comunemente impiegate per tenere traccia del numero di volte che una funzione viene eseguita e per modificarne il comportamento ad intervalli regolari

La variabile page_typepage_type agisce da elemento di controllo: quando il numero della pagina è dispari, la funzione stampa la stringa puntata da chap_titlechap_title sul lato destro della pagina; se il numero della pagina è pari, la stringa appare spostata a sinistra

page_typepage_type deve essere fissa, altrimenti si stamperebbe sempre l’intestazione relativa alle pagine dispari

#define ODD 0#define EVEN 1

void print_header(chap_title)char *chap_title;{ static char page_typeODD; if (page_type ODD) { printf(“\t\t\t\t\t%s\n\n”, chap_title); page_type EVEN; } else { printf(“%s\n\n”, chap_title); page_type ODD; }} 99

L’uso di variabili con durata fissaL’uso di variabili con durata fissa

Page 10: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• L’ambito di visibilitàambito di visibilità di una variabile definisce la regione di codice da cui è possibile accedere alla variabile

• Esistono quattro tipi di ambiti di visibilità: programmaprogramma, filefile, funzionefunzione e bloccoblocco L’ambito di visibilità a livello di programmaambito di visibilità a livello di programma implica che

una variabile è accessibile da tutti i file sorgente; le variabili con ambito di visibilità a livello di programma sono variabili globalivariabili globali

L’ambito di visibilità a livello di fileambito di visibilità a livello di file implica che una variabile è accessibile dal punto in cui è dichiarata fino alla fine del file sorgente in cui si trova

L’ambito di visibilità a livello di funzioneambito di visibilità a livello di funzione implica che il nome di una variabile è accessibile dall’inizio alla fine della funzione in cui è dichiarata

L’ambito di visibilità a livello di bloccoambito di visibilità a livello di blocco implica che una variabile è accessibile dal punto in cui è dichiarata fino alla fine del blocco in cui si trova

1010

L’ambito di visibilità L’ambito di visibilità 1 1

Page 11: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

Le variabili dichiarate all’interno di un blocco hanno ambito di visibi-lità a livello di blocco

Le variabili dichiarate all’esterno di un blocco hanno ambito di visibilità a livello di file se sono staticstatic, oppure a livello di pro-gramma

Solo le etichette dell’istruzione gotogoto hanno ambito di visibilità a livello di funzione

• L’ambito di visibilità di una variabile è determinato dalla posizione della dichiarazione:

Ambito di visibilità a livello di blocco

Ambito di visibilità a livello di programma

Ambito di visibilità a livello di file

Ambito di visibilità a livello di funzione

Le relazioni gerarchiche tra Le relazioni gerarchiche tra gli ambiti di visibilitàgli ambiti di visibilità

1111

L’ambito di visibilità L’ambito di visibilità 2 2

Page 12: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Esempio:Esempio:

• I parametri delle funzioni hanno ambito di visibilità a livello di blocco: sono trattati come se fossero la prima dichiarazione di variabile nel blocco di livello più alto contenuto nella funzione

int i; /* ambito di visibilità a livello di programma */static int j; /* ambito di visibilità a livello di file */

int func(k) /* ambito di visibilità a livello di programma */int k; /* ambito di visibilità a livello di blocco */{ int m; /* ambito di visibilità a livello di blocco */ start: ; /* ambito di visibilità a livello di funzione */ … … …}

1212

L’ambito di visibilità L’ambito di visibilità 3 3

Page 13: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Il C consente l’attribuzione dello stesso nome a variabili diverse con ambiti di visibilità distinti

• È anche possibile che variabili con lo stesso nome abbiano ambiti parzialmente sovrapposti: la variabile con l’ambito di visibilità più limitato preclude temporaneamente la visibilità dell’altra

int j10; // visibilità a livello di programmamain()

{

int j; /* visibilità a livello di blocco:

* nasconde la variabile globale j */

for (j0; j<5; j) printf(“j: %d”, j);

}

L’esecuzione del pro-gramma produce:

j: 0j: 0j: 1j: 1j: 2j: 2j: 3j: 3j: 4j: 4

La variabile globale jj mantiene inalterato il valore iniziale 10

1313

L’ambito di visibilità L’ambito di visibilità 4 4

Page 14: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Una variabile con ambito di visibilità a livello di blocco non può essere acceduta dall’esterno del blocco in cui è dichiarata consente di proteggere la variabile da effetti collaterali

non desiderati riduce la complessità del programma, rendendolo più

leggibile e mantenibile• Variabili possono essere dichiarate all’interno di

blocchi innestati, nascondendo temporaneamente le variabili con lo stesso nome eventualmente definite in blocchi più esterni

• Le etichette dell’istruzione gotogoto sono gli unici nomi con ambito di visibilità a livello di funzione: devono avere nomi univoci all’interno della stessa funzione, mentre nomi coincidenti in funzioni diverse non originano conflitti

1414

L’ambito di visibilità L’ambito di visibilità a livello di blocco e funzionea livello di blocco e funzione

Page 15: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Associare un ambito di visibilità a livello di file a una variabile significa renderla referenziabile nella parte rimanente del file in cui è definita Se il file contiene più funzioni, tutte le funzioni che

seguono la dichiarazione della variabile sono in grado di referenziarla

• Per dichiarare una variabile con ambito di visibilità a livello di file occorre inserire la dichiarazione al di fuori delle funzioni e usare la parola chiave staticstatic

• Le variabili con ambito di visibilità a livello di programma, dette variabili globalivariabili globali, sono visibili in tutti i file sorgente (compreso quello in cui vengono dichiarate)

• Una variabile globale deve essere dichiarata al di fuori delle funzioni e non usando la parola chiave staticstatic

1515

L’ambito di visibilità L’ambito di visibilità a livello di file e programmaa livello di file e programma

Page 16: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• All’interno di un blocco, staticstatic attribuisce ad una variabile durata fissa, anziché automatica

• All’esterno di una funzione, staticstatic non è correlata alla durata della variabile, ma ne controlla l’ambito di visibilità a livello di file, anziché di programma

La parola chiave staticstatic specifica sia l’ambito di visibilità che la durata di una variabile:

All’interno di un blocco, le regole di visibilità del blocco sono più stringenti di quelle a livello di file: la durata fissa è l’unico effetto che si manifesta

All’esterno di una funzione, la durata è già fissa: l’ambito di visibilità a livello di file è l’unico effetto che si manifesta 1616

I due significati di I due significati di staticstatic

Page 17: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• L’uso delle variabili globalivariabili globali dovrebbe essere evitato perché aumenta la complessità dei programmi e li rende difficilmente mantenibili

• Le variabili globali possono portare a conflitti tra moduli se, per errore, vengono scelti nomi uguali per variabili globali distinte

• Quando occorre condividere dati tra procedure diverse, è buona regola passare i dati come parametri o passare puntatori all’area di memoria condivisa

• Le regole di attribuzione di nomi alle variabili globali sono diverse: i nomi globali devono essere riconoscibili non solo al compilatore, ma anche al linkerlinker ed al binderbinder: lo standard ANSI garantisce il riconoscimento dei primi sei caratteri (tuttavia, nulla vieta di aggiungere caratteri per rendere i nomi più significativi)

1717

Le variabili globaliLe variabili globali

Page 18: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Finora, la dichiarazione di variabile corrispondeva all’allocazione di memoria per quella variabile: l’allocazione di memoria è, in realtà, il risultato di un solo tipo di dichiarazione, detta definizionedefinizione

• Le variabili globali consentono un secondo tipo di dichiarazione, detta allusioneallusione: non si alloca memoria, ma si informa il compilatore che esiste una variabile del tipo specificato definita altrove

main()

{

extern int f(); /* allusione a funzione */

extern int j; /* allusione a variabile */

extern float f_array_of_f[]; /* allusione a variabile */

… … …

1818

Definizioni e allusioni Definizioni e allusioni 1 1

Page 19: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Le variabili globali seguono le stesse regole delle funzioni: ogni volta che si utilizzano variabili definite in altro file, è necessario dichiararle con allusioni

• La parola chiave externextern specifica che la variabile è definita altrove

• Le allusioni consentono al compilatore di effettuare i controlli di tipo: per ogni variabile globale, possono essere presenti un numero qualunque di allusioni, ma una sola definizione

1919

Definizioni e allusioni Definizioni e allusioni 2 2

Page 20: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• Lo standard ANSI prevede che, per definire una variabile globale, sia necessario inserire all’esterno di una funzione una dichiarazione con inizializzazione: la presenza o meno della parola chiave externextern non ha alcun effetto

• Se il valore iniziale fosse stato omesso, il compilatore avrebbe prodotto un’allusione, se è specificato externextern,, o una definizione di provadefinizione di prova, che si trasforma… …in una definizione effettiva, con inizializzazione a 0, se

nel file non compare altra dichiarazione …in un’allusione, se nel file sorgente è contenuta una

definizione reale

2020

Definizioni e allusioni Definizioni e allusioni 3 3

Page 21: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• La parola chiave registerregister consente di suggerire al compilatore quali variabili dovrebbero essere memorizzate nei registri

• Il livello di supporto offerto dai compilatori allo specificatore registerregister è molto variabile: alcuni compilatori memorizzano effettivamente tutte le variabili registerregister in registri, fino a quando ce ne sono disponibili, altri lo ignorano, altri lo interpretano per determinare se è davvero proficuo memorizzare una data variabile in un registro

• Ad una variabile registerregister non è assegnato alcun indirizzo di memoria: anche se il suggerimento registerregister non viene seguito dal compilatore, se si tenta di accedere all’indirizzo della variabile, si ottiene una segnalazione di errore

• Sono candidati ideali per la memorizzazione registerregister i contatori dei cicli forfor, sui quali vengono effettuate molte operazioni, temporalmente vicine 2121

Lo specificatore Lo specificatore registerregister

Page 22: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

• La parola chiave constconst (derivata dal C) indica che una variabile non può essere modificata dopo l’inizializzazione:

• La parola chiave constconst può essere impiegata in alternativa alla direttiva ##definedefine

const char str[9] “Costante”;str[0] ‘a’; /* non ammesso */

2222

Il modificatore di classe Il modificatore di classe constconst

Page 23: Anno accademico 2010-2011 1 Le classi di memorizzazione.

Anno accademico 2010-2011Anno accademico 2010-2011

Specificatore di classe di memorizzazione

All’esterno di una funzione

All’interno di una funzione

Argomenti di una funzione

autoauto o registerregister NON PERMESSO Visibilità: blocco

Durata: automatica

Visibilità: blocco

Durata: automatica

staticstatic Visibilità: file

Durata: fissa

Visibilità: blocco

Durata: fissa

NON PERMESSO

externextern Visibilità: programma

Durata: fissa

Visibilità: blocco

Durata: fissa

NON PERMESSO

nessuno specificatore di classe

Visibilità: programma

Durata: fissa

Visibilità: blocco

Durata: automatica

Visibilità: blocco

Durata: automatica

Posizione della dichiarazione

La semantica degli specificatori di classe di La semantica degli specificatori di classe di memorizzazione memorizzazione

2323

Riepilogo delle classi di Riepilogo delle classi di memorizzazionememorizzazione