Considerate questo codice,
int some_int = 100;
while(some_int == 100)
{
//your code
}
Quando questo programma viene compilato, il compilatore può ottimizzare questo codice, se constata che il programma mai mai rende qualsiasi tentativo di modificare il valore di some_int
, in modo da potrebbe essere tentato di ottimizzare il ciclo while
cambiandolo da while(some_int == 100)
a semplicemente while(true)
in modo che l'esecuzione possa essere veloce (poiché la condizione nel ciclo while
sembra essere true
sempre). (se il compilatore non ottimizzare esso, allora deve recuperare il valore di some_int
(se non è caricato in un registro) e confrontarlo con 100, ogni volta che è ovviamente un po 'lento.)
Tuttavia, l'ottimizzazione (di alcune parti del programma) potrebbe essere indesiderabile, perché potrebbe essere che qualcun altro stia modificando il valore di some_int
da all'esterno del programma di cui il compilatore non è a conoscenza di, poiché può ' lo vedo; ma è come l'hai progettato. In tal caso, l'ottimizzazione del compilatore sarebbe non produrre il risultato desiderato!
Quindi, per garantire il risultato desiderato, è necessario in qualche modo impedire al compilatore di ottimizzare il ciclo while
. È qui che la parola chiave volatile
svolge il suo ruolo.Tutto quello che devi fare è questo,
volatile int some_int = 100; //note the 'volatile' qualifier now!
In altre parole vorrei spiegare questo come segue:
volatile
dice al compilatore che,
"Hey compilatore, io' m volatile e, tu sai, posso essere cambiato da qualche XYZ di cui non sei nemmeno a conoscenza. Quello XYZ potrebbe essere qualsiasi cosa. Forse qualche alieno al di fuori di questo pianeta chiamato il programma . Forse qualche illuminazione, qualche forma di interruzione, vulcani, ecc., , , può mutarmi. Può essere. Non sai mai chi sarà il a cambiarmi! Quindi tu O ignorante, smetti di suonare un dio onnisciente , e non osare toccare il codice dove sono presente. Va bene?"
Bene, questo è il modo volatile
impedisce compilatore di ottimizzazione del codice. Ora google per vedere alcuni esempi di esempio.
Citando dal ++ standard C ($ 7.1.5.1/8)
[..] volatile è un suggerimento per il attuazione evitano aggressivo ottimizzazione coinvolge l'oggetto perché il valore dell'oggetto potrebbe essere cambiata per mezzo non rilevabili da un implementazione [...]
Argomento correlato:.
Does making a struct volatile make all its members volatile?
Uguale a [C++: Quando ha la volatilità La parola chiave ti ha mai aiutato? ] (http://stackoverflow.com/questions/72552/c-when-has-the-volatile-keyword-ever-helped-you). –
Anche se si tratta di un duplicato, penso che la risposta di Nawaz sia molto più completa e comprensibile della domanda duplicata. – ross