Membri volatile
Il C++ e` un linguaggio adatto a qualsiasi tipo di applicazione, in particolare
a quelle che per loro natura si devono interfacciare direttamente all'hardware.
Una prova in tal proposito e` fornita dalla keyword volatile
che posta davanti ad un identificatore di variabile comunica al compilatore
che quella variabile puo` cambiare valore in modo asincrono rispetto al sistema:
volatile int Var;
/* ... */
int B = Var;
int C = Var;
/* ... */
In tal modo il compilatore non ottimizza gli accessi a tale risorsa e ogni tentativo
di lettura di quella variabile e` tradotto in una effettiva lettura della locazione
di memoria corrispondente.
Gli oggetti volatile sono normalmente utilizzati per mappare registri
di unita` di I/O all'interno del programma e per essi valgono le stesse regole
viste per gli oggetti const ; in particolare solo funzioni membro
volatile possono essere utilizzate su oggetti volatile
e non si possono dichiarare volatile costruttori e distruttori
(che sono comunque utilizzabili sui tali oggetti):
class VolatileClass {
public:
VolatileClass(int ID);
long int ReadFromPort() volatile;
/* ... */
private:
volatile long int ComPort;
const int PortID;
/* ... */
};
VolatileClass::VolatileClass(int ID) : PortID(ID) {}
long int VolatileClass::ReadFromPort() volatile {
return ComPort;
}
Si noti che volatile non e` l'opposto di const : quest'ultima
indica al compilatore che un oggetto non puo` essere modificato indipendentemente
che sia trattato come una vera costante o una variabile a sola lettura, volatile
invece dice che l'oggetto puo` cambiare valore al di fuori del controllo del
sistema; quindi e` possibile avere oggetti const volatile . Ad esempio
unita` di input, come la tastiera, possono essere mappati tramite oggetti dichiarati
const volatile :
class Keyboard {
public:
Keyboard();
const char ReadInput() const volatile;
/* ... */
private:
const volatile char* Buffer;
};
|