Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoAlda Santoro Modificato 10 anni fa
1
Anno accademico 2010-2011 1 Le classi di memorizzazione
2
Anno accademico 2010-2011 2 Sommario Le classi di memorizzazioneLe classi di memorizzazione Durata fissa e durata automatica Durata fissa e durata automatica Lambito di visibilità Lambito di visibilità
3
Anno accademico 2010-2011 ambito di visibilitàscopeNel linguaggio C, viene offerta la possibilità di condividere variabili e di delimitare le porzioni di codice che sfruttano tali condivisioni, mediante la definizione dellambito di visibilità, o scope, delle variabili Lambito di visibilità è il termine tecnico che denota la parte del testo sorgente C in cui è attiva la dichiarazione di un nomeLambito di visibilità è il termine tecnico che denota la parte del testo sorgente C in cui è attiva la dichiarazione di un nome durataInoltre, le variabili hanno una durata, che descrive il lasso temporale di memorizzazione dei valori di una variabile: durata fissa Nel caso di variabili con durata fissa, i valori memorizzati vengono mantenuti anche allesterno dellambito di visibilità classe di memorizzazioneLe proprietà di visibilità e di durata individuano la classe di memorizzazione di una variabile Introduzione 1 3
4
Anno accademico 2010-2011 j durata automatica ar durata fissa staticLa variabile j ha durata automatica, mentre ar ha durata fissa, perché dichiarata static : j A j 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) ar ar viene allocato la prima volta che viene eseguito il blocco e mantiene lindirizzo originale per lintera esecuzione del programma void func() { int j; static int ar[] {1,2,3,4} … … … } jar visibilità a livello di blocco func()Le variabili j ed ar hanno entrambe visibilità a livello di blocco, perché definite allinterno di un blocco: pos- sono essere referenziate solo dalle istruzioni che appartengono al blocco (il corpo della funzione func() ) jar localiLe variabili j ed ar sono dette locali Esempio 4 Introduzione 2
5
Anno accademico 2010-2011 durata fissa durata automaticaLe variabili con durata fissa sono permanenti, mentre le variabili con durata automatica sono allocate più volte durante lesecuzione del programma Ad una variabile fissa viene associata una locazione di memoria allinizio 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 allambito di visibilità della variabile viene rieseguito, la variabile viene generalmente allocata altrove: non si mantiene il valore della variabile fra due esecuzioni successive 5 Durata fissa e durata automatica 1
6
Anno accademico 2010-2011 staticLe variabili locali sono automatiche per default, ma possono essere rese fisse se dichiarate static autoLa parola chiave auto definisce esplicitamente una variabile automatica, ma è usata raramente perché ridondante 6 Durata fissa e durata automatica 2
7
Anno accademico 2010-2011 void increment() { int j 1; static int k 1; j ; k ; printf(j: %d\t k: %d\n, j, k); } main() { increment(); } increment() jk La funzione increment() incre- menta i valori delle variabili j e k, entrambe inizializzate a 1 Il risultato dellesecuzione del pro- gramma è: j: 2k: 2 j: 2k: 3 j: 2k: 4 Le variabili fisse vengono inizializzate una sola volta, mentre quelle automatiche vengono inizializzate ogni volta che viene eseguito il blocco che le contiene 7 Linizializzazione delle variabili 1
8
Anno accademico 2010-2011 stackLe variabili fisse vengono inizializzate di default al valore zero, quelle automatiche non vengono inizializzate (e sono normalmente allocate sullo stack) Le variabili scalari automatiche possono essere inizializzate con una qualunque espressione, con il solo vincolo che tutte le variabili contenute nellespressione 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 8 Linizializzazione delle variabili 2
9
Anno 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 page_type chap_title La variabile page_type agisce da elemento di controllo: quando il numero della pagina è dispari, la funzione stampa la stringa puntata da chap_title sul lato destro della pagina; se il numero della pagina è pari, la stringa appare spostata a sinistra page_type page_type deve essere fissa, altrimenti si stamperebbe sempre lintestazione relativa alle pagine dispari #define ODD 0 #define EVEN 1 void print_header(chap_title) char *chap_title; { static char page_type ODD; 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; } 9 Luso di variabili con durata fissa
10
Anno accademico 2010-2011 ambito di visibilitàLambito di visibilità di una variabile definisce la regione di codice da cui è possibile accedere alla variabile programmafile funzionebloccoEsistono quattro tipi di ambiti di visibilità: programma, file, funzione e blocco ambito di visibilità a livello di programma variabili globali Lambito 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 globali ambito di visibilità a livello di file Lambito 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 ambito di visibilità a livello di funzione Lambito di visibilità a livello di funzione implica che il nome di una variabile è accessibile dallinizio alla fine della funzione in cui è dichiarata ambito di visibilità a livello di blocco Lambito 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 10 Lambito di visibilità 1
11
Anno accademico 2010-2011 Le variabili dichiarate allinterno di un blocco hanno ambito di visibi- lità a livello di blocco static Le variabili dichiarate allesterno di un blocco hanno ambito di visibilità a livello di file se sono static, oppure a livello di pro- gramma goto Solo le etichette dellistruzione goto hanno ambito di visibilità a livello di funzione Lambito 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 gli ambiti di visibilità 11 Lambito di visibilità 2
12
Anno 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 */ … … … } 12 Lambito di visibilità 3
13
Anno accademico 2010-2011 Il C consente lattribuzione 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 lambito di visibilità più limitato preclude temporaneamente la visibilità dellaltra int j 10; // visibilità a livello di programma main() { int j; /* visibilità a livello di blocco: * nasconde la variabile globale j */ for (j 0; j<5; j ) printf(j: %d, j); } Lesecuzione del pro- gramma produce: j: 0 j: 1 j: 2 j: 3 j: 4 j La variabile globale j mantiene inalterato il valore iniziale 10 13 Lambito di visibilità 4
14
Anno accademico 2010-2011 Una variabile con ambito di visibilità a livello di blocco non può essere acceduta dallesterno 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 allinterno di blocchi innestati, nascondendo temporaneamente le variabili con lo stesso nome eventualmente definite in blocchi più esterni gotoLe etichette dellistruzione goto sono gli unici nomi con ambito di visibilità a livello di funzione: devono avere nomi univoci allinterno della stessa funzione, mentre nomi coincidenti in funzioni diverse non originano conflitti 14 Lambito di visibilità a livello di blocco e funzione
15
Anno 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 staticPer 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 static variabili globaliLe variabili con ambito di visibilità a livello di programma, dette variabili globali, sono visibili in tutti i file sorgente (compreso quello in cui vengono dichiarate) staticUna variabile globale deve essere dichiarata al di fuori delle funzioni e non usando la parola chiave static 15 Lambito di visibilità a livello di file e programma
16
Anno accademico 2010-2011 staticAllinterno di un blocco, static attribuisce ad una variabile durata fissa, anziché automatica staticAllesterno di una funzione, static non è correlata alla durata della variabile, ma ne controlla lambito di visibilità a livello di file, anziché di programma static La parola chiave static specifica sia lambito di visibilità che la durata di una variabile: Allinterno di un blocco, le regole di visibilità del blocco sono più stringenti di quelle a livello di file: la durata fissa è lunico effetto che si manifesta Allesterno di una funzione, la durata è già fissa: lambito di visibilità a livello di file è lunico effetto che si manifesta 16 I due significati di static
17
Anno accademico 2010-2011 variabili globaliLuso delle variabili 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 allarea di memoria condivisa linkerbinderLe regole di attribuzione di nomi alle variabili globali sono diverse: i nomi globali devono essere riconoscibili non solo al compilatore, ma anche al linker ed al binder: lo standard ANSI garantisce il riconoscimento dei primi sei caratteri (tuttavia, nulla vieta di aggiungere caratteri per rendere i nomi più significativi) 17 Le variabili globali
18
Anno accademico 2010-2011 definizioneFinora, la dichiarazione di variabile corrispondeva allallocazione di memoria per quella variabile: lallocazione di memoria è, in realtà, il risultato di un solo tipo di dichiarazione, detta definizione allusioneLe variabili globali consentono un secondo tipo di dichiarazione, detta allusione: 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 */ … … … 18 Definizioni e allusioni 1
19
Anno 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 externLa parola chiave extern 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 19 Definizioni e allusioni 2
20
Anno accademico 2010-2011 externLo standard ANSI prevede che, per definire una variabile globale, sia necessario inserire allesterno di una funzione una dichiarazione con inizializzazione: la presenza o meno della parola chiave extern non ha alcun effetto extern, definizione di provaSe il valore iniziale fosse stato omesso, il compilatore avrebbe prodotto unallusione, se è specificato extern, o una definizione di prova, che si trasforma… …in una definizione effettiva, con inizializzazione a 0, se nel file non compare altra dichiarazione …in unallusione, se nel file sorgente è contenuta una definizione reale 20 Definizioni e allusioni 3
21
Anno accademico 2010-2011 registerLa parola chiave register consente di suggerire al compilatore quali variabili dovrebbero essere memorizzate nei registri register registerIl livello di supporto offerto dai compilatori allo specificatore register è molto variabile: alcuni compilatori memorizzano effettivamente tutte le variabili register 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 register registerAd una variabile register non è assegnato alcun indirizzo di memoria: anche se il suggerimento register non viene seguito dal compilatore, se si tenta di accedere allindirizzo della variabile, si ottiene una segnalazione di errore register forSono candidati ideali per la memorizzazione register i contatori dei cicli for, sui quali vengono effettuate molte operazioni, temporalmente vicine 21 Lo specificatore register
22
Anno accademico 2010-2011 constLa parola chiave const (derivata dal C ) indica che una variabile non può essere modificata dopo linizializzazione: const #defineLa parola chiave const può essere impiegata in alternativa alla direttiva #define const char str[9] Costante; str[0] a; /* non ammesso */ 22 Il modificatore di classe const
23
Anno accademico 2010-2011 Specificatore di classe di memorizzazione Allesterno di una funzione Allinterno di una funzione Argomenti di una funzione auto register auto o register NON PERMESSOVisibilità: blocco Durata: automatica Visibilità: blocco Durata: automatica static Visibilità: file Durata: fissa Visibilità: blocco Durata: fissa NON PERMESSO extern 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 memorizzazione 23 Riepilogo delle classi di memorizzazione
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.