2010-12-14 33 views
237

Possible en double:
C++: When Has The volatile Keyword Ever Helped You?Pourquoi utilisons-nous le mot clé volatile en C++?

Je l'ai jamais utilisé, mais je me demande pourquoi les gens l'utilisent? Qu'est-ce que ça fait exactement? J'ai cherché sur le forum, je n'ai trouvé que des sujets C# ou Java.

+0

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). –

+10

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

Répondre

798

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?

+46

Il est important d'ajouter que «volatile» est un qualificatif, similaire à 'const' (mais bien sûr avec une signification différente), donc vous pouvez aussi déclarer des méthodes' volatiles 'qui ne peuvent être appelées que sur des instances 'volatiles'. – ereOn

+0

@ fingerprint211b: merci :-) (c'est décevant que les gens n'encouragent pas le bon travail, au contraire ils le découragent, même si ça ne me pose pas de problème s'ils me disent la raison pour laquelle ils le font, au moins comme ça peut m'améliorer.) – Nawaz

+0

Je pensais que c'est ce que le mot-clé 'extern' est pour? – Maxpm

8

En programmation informatique, en particulier dans les langages de programmation C, C++ et C#, une variable ou un objet déclaré avec le mot-clé volatile a généralement des propriétés spéciales liées à l'optimisation et/ou au thread. D'une manière générale, le mot clé volatile est destiné à empêcher le (pseudo) compilateur d'appliquer des optimisations sur le code qui supposent que les valeurs des variables ne peuvent pas changer "d'elles-mêmes". (C) Wikipedia

http://en.wikipedia.org/wiki/Volatile_variable

+27

volatile n'a rien à voir avec les threads –

+20

Le mot clé volatile est un qualificatif de type utilisé pour déclarer qu'un objet peut être modifié dans le programme par quelque chose comme le système d'exploitation, le matériel ou un thread s'exécutant simultanément. (c) Référence C++ MSDN. (http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx) Mais certainement msdn et wikipedia ont tort, et vous avez raison. – Ivan

+3

'volatile 'n'aide pas à enfiler. Les lectures/écritures volatiles peuvent toujours être réordonnées par rapport aux non-volatiles, ce qui les rend inutilisables pour les threads. En outre, vous avez peut-être remarqué le gros "Microsoft spécifique" sur la page MSDN. L'implémentation de volatile de Microsoft fournit des garanties supplémentaires au-delà de celles spécifiées par la norme. Alors oui, techniquement parlant, MSDN est faux. Et il ne devrait pas être surprenant que Wikipédia puisse se tromper. – jalf

-5

Le mot-clé volatile est un qualificatif de type utilisé pour déclarer qu'un objet peut être modifié dans le programme par quelque chose comme le système d'exploitation, le matériel, ou un fil d'exécuter simultanément.

déclarateur volatil;

+13

Copier-coller des réponses est généralement fait en citant des parties pertinentes de la source d'origine, tout en liant à celui-ci. Ne pas le faire est un cas de plagiat que je déteste.Même si vous avez écrit l'article original, ne pas le lier est un auto-plagiat (qui est sans doute moins détestable). –