Considérez ce code,
int some_int = 100;
while(some_int == 100)
{
//your code
}
Lorsque ce programme sera compilé, le compilateur peut optimiser ce code, si elle constate que le programme ne fait jamais toute tentative de changer la valeur de some_int
, il peut être tenté d'optimiser la boucle while
en la changeant de while(some_int == 100)
en simplement while(true)
afin que l'exécution puisse être rapide (puisque la condition dans la boucle while
semble toujours être true
). (si le compilateur n'optimise pas, alors il doit récupérer la valeur de some_int
(si elle est pas chargé sur un registre) et le comparer avec 100, chaque fois que ce qui est évidemment un peu lent.)
Cependant, parfois, l'optimisation (de certaines parties de votre programme) peut être indésirable, car il se peut que quelqu'un d'autre change la valeur de some_int
de en dehors du programme que le compilateur ne connaît pas, car il peut ' je le vois; mais c'est comme ça que vous l'avez conçu. Dans ce cas, l'optimisation du compilateur et non produira le résultat souhaité! Par conséquent, pour assurer le résultat souhaité, vous devez d'une certaine manière empêcher le compilateur d'optimiser la boucle while
. C'est là que le mot clé volatile
joue son rôle.Tout ce que vous devez faire est-ce,
volatile int some_int = 100; //note the 'volatile' qualifier now!
En d'autres termes, j'expliquer cela comme suit:
volatile
indique au compilateur que,
« Hey compilateur, je Je suis volatile et, vous savez, je peux être changé par un XYZ que vous n'êtes même pas au courant de ce que XYZ pourrait être quelque chose, peut-être un alien en dehors de cette planète appelé programme. Peut-être un peu d'éclairage, une certaine forme d'interruption, les volcans, etc peuvent me mutater . Peut être. Vous ne savez jamais qui va me changer! Donc, vous ignorant, arrêtez de jouer un dieu omniscient , et n'osez pas toucher le code où je suis présent. D'accord? »
Eh bien, c'est ainsi volatile
empêche le compilateur à partir du code optimisation. Maintenant google pour voir quelques exemples d'échantillons.
Je cite la norme C++ (7.1.5.1/8 $)
[..] volatile est une allusion à la mise en œuvre à éviter agressive optimisation impliquant l'objet parce que la valeur de l'objet peut être modifié par indétectables par une mise en œuvre [...]
Sujet connexe:.
Does making a struct volatile make all its members volatile?
Identique [C++: Quand est-volatile Mot-clé vous a déjà aidé? ] (http://stackoverflow.com/questions/72552/c-when-has-the-volatile-keyword-ever-helped-you). –
Bien que ce soit un doublon, je pense que la réponse de Nawaz est beaucoup plus compréhensible et compréhensible que la question en double. – ross