Barninga Z
a- a+

Le variabili C register

L'ACCESSIBILITÀ' E LA DURATA DELLEVARIABILI

Le variabili register 

Dal momento che il compilatore colloca le variabili automaticnella RAM del calcolatore, i valori in esse contenuti devonospesso essere copiati nei registri della CPU per poter essereelaborati e, se modificati dall'elaborazione subita,copiati nuovamente nelle locazioni di memoria di provenienza.Tali operazioni sono svolte in modo trasparente per ilprogrammatore, ma possono deteriorare notevolmente laperformance di un programma, soprattutto se ripetutepiù e più volte (ad esempio all'interno diun ciclo con molte iterazioni). 

Dichiarando una variabile automatic con la parola chiaveregister si forza il compilatore ad allocarladirettamente in un registro della CPU, con notevoleincremento di efficienza nell'elaborazione del valore inessa contenuto. Ecco un esempio: 

register int i = 10;    do {  printf("%2d" ,i);    } while(i--);

Il ciclo visualizza,  incolonnati[24], i numeri da10 a 0; la variabile i si comportacome una qualsiasi variabile automatic, ma essendoprobabilmente gestita in un registro consenteun'elaborazione più veloce. E' d'obbligoscrivere "probabilmente gestita" in quanto non sipuò essere assolutamente certi che il compilatorecollochi una variabile dichiarata con registerproprio in un registro della CPU: in alcune situazionipotrebbe gestirla come una variabile automatic qualsiasi,allocandola in memoria. I principali motivi sono due: lavariabile potrebbe occupare più byte di quanticompongono un registro della  CPU[25], o potrebbero nonesserci  registri disponibili allo scopo[26]. 

Già che ci siamo, diamo un'occhiata piùapprofondita all'esempio di poco fa. Innanzitutto varilevato che nella dichiarazione di i potrebbeessere omessa la parola chiave int

register i = 10;

Abbiamo poi utilizzato un costrutto nuovo: il ciclodo...while. Esso consente di identificare un blocco di codice(quello compreso tra le graffe) che viene eseguitofinché la condizione specificata tra parentesi dopo laparola chiave while continua ad essere vera. Ilciclo viene sempre eseguito almeno una volta, perchéil test è effettuato al termine del medesimo. Nelnostro caso, quale test viene effettuato? Dal momento che nonè utilizzato alcun operatore di confronto esplicito,viene controllato se il risultato dell'espressione nelletonde è diverso da 0. L'operatore--, detto di autodecremento, è specificatodopo la variabile a cui è applicato. Ciòassicura che i sia decrementata dopol'effettuazione del test. Perciò il ciclo èeseguito 11 volte, con i che varia da 10 a0 inclusi. Se l'espressione fosse --i,il decremento sarebbe eseguito prima del test, con laconseguenza che per i pari a 0 il ciclo nonverrebbe più eseguito. 

Come per le variabili automatic, non è possibileconoscere il contenuto di una variabile registerprima della sua esplicita inizializzazione mediante unoperazione di assegnamento. In questo caso non si tratta diutilizzo e riutilizzo di un'area di memoria, ma di unregistro macchina: non possiamo conoscerne a priori ilcontenuto nel momento in cui esso è destinato allagestione della variabile (dichiarazione della variabile).Inoltre, analogamente alle variabili automatic, anche quelleregister cessano di esistere all'uscita delblocco di codice (solitamente una funzione) nel quale sonodichiarate e il registro macchina viene utilizzato per altriscopi. 

Le variabili register, a differenza delleautomatic, non hanno indirizzo: ciò appare ovvio se sipensa che i registri macchina si trovano nella CPU e nonnella RAM. La conseguenza immediata è che unavariabile register non può mai esserereferenziata tramite un puntatore. Nel nostro esempio, iltentativo di assegnare ad un puntatore l'indirizzo dii provocherebbe accorate proteste da parte delcompilatore. 

register i;    int *iPtr = &i;  // errore! i non ha indirizzo

Pur non avendo indirizzo, le variabili registerpossono contenere un indirizzo, cioè un puntatore: ladichiarazione 

register char *ptr_1, char *ptr_2;

non solo è perfettamente lecita, ma anzi genera, sepossibile, due puntatori (a carattere) particolarmenteefficienti. 

 



Ti potrebbe interessare anche

commenta la notizia