2010-03-15 5 views

Répondre

6

EDIT:

Cette réponse a été affiché lorsque la question était sur le mot-clé volatile. La question semble avoir été modifiée par un tiers.

ORIGINAL:

volatil informe le compilateur qu'il ne doit pas supposer que la valeur qu'elle vient de mettre dans la variable marquée comme volatile sera là la prochaine fois qu'il utilise ... qu'il doit vérifier la valeur actuelle avant l'utiliser à nouveau.

Un exemple est si la variable représente un emplacement de mémoire qui pourrait être changé par un autre processus.

Voici un exemple (été âges depuis que je l'ai fait en C++ donc s'il vous plaît pardonnez les petits problèmes de syntaxe):

volatile int x; 

int DoSomething() 
{ 
    x = 1; 

    DoSomeOtherStuff(); 

    return x+1; // Don't just return 2 because we stored a 1 in x. 
       // Check to get its current value 
} 
+1

Ceci est correct. Il est souvent utilisé dans les applications embarquées et en temps réel. Et – penguin4hire

+1

indique au compilateur de ne pas effectuer des optimisations sur elle ... – jasonline

+4

@jasonline: il indique au compilateur qu'il ne doit pas modifier le nombre ou l'ordre de lecture et d'écriture, et il ne doit pas déplacer tout ou lit les écritures sur les points de séquence. Il ne dit pas exactement "ne pas effectuer d'optimisations". Par exemple, les boucles qui modifient les volatiles peuvent encore être déroulées et l'accès au code volatil peut être déplacé à travers des accès non-volatils. Je suppose que même l'exécution spéculative serait OK à condition que vous ayez de la mémoire transactionnelle matérielle et pas d'adresses E/S magiques. –

20

Pour répondre à la question sur ce que cela signifie d'avoir une « fonction membre volatile » (qui peut ou peut-être pas ce qui était prévu à l'origine par la personne qui a posté la question), marquant une fonction membre comme const ou volatile (ou un combiné const volatile) applique ces qualificatifs au pointeur this utilisé dans la fonction. Comme indiqué par la norme (9.2.1 « this Le pointeur »):

Le type de ce dans une fonction de membre d'un class X est. Si la fonction de membre est déclaré const, le type de c'est const X*, si la fonction de membre est déclaré volatile, le type de this est volatile X*, et si la fonction de membre est déclaré const volatile, le type de c'est const volatile X*.

Ainsi, en marquant la fonction membre comme volatile vous gagnerais tout accès aux membres de données non statiques de l'objet dans cette fonction de membre comme volatile.

+6

Donc, en pratique, si 'obj' est 'volatile Object * obj', vous ne pouvez pas appeler une fonction membre marquée' non volatile '. – bobobobo