274 votes

Pourquoi est-ce que volatile existe ?

Ce que fait le `` mot clé ? En C++ quel problème résout-il ?

Dans mon cas, je n’ai jamais sciemment besoin il.

321voto

Doug T. Points 33360

volatile est nécessaire si vous lisez à partir d'un endroit en mémoire que, disons, un tout autre processus/périphérique/tout ce que peut écrire.

J'ai l'habitude de travailler avec dual-port ram dans un système multiprocesseur à droite C. Nous avons utilisé un matériel gérés 16 bits valeur d'un sémaphore de savoir quand l'autre gars a été fait. Essentiellement, nous l'avons fait:

void waitForSemaphore()
{
   volatile uint16_t* semPtr = WELL_KNOWN_SEM_ADDR;/*well known address to my semaphore*/
   while ((*semPtr) != IS_OK_FOR_ME_TO_PROCEED);
}

Sans volatile, l'optimiseur voit dans la boucle inutile (Le gars ne définit jamais la valeur! Il est fou, se débarrasser de ce code!) et mon code, de procéder sans avoir acquis le sémaphore, à l'origine des problèmes plus tard.

97voto

ChrisN Points 10734

volatile est nécessaire lors du développement de systèmes embarqués ou de pilotes de périphériques, où vous devez lire ou écrire un périphérique matériel mappé en mémoire. Le contenu d'un registre de périphérique particulier peut changer à tout moment. Vous avez donc besoin du mot clé volatile pour vous assurer que ces compilateurs n'optimisent pas ces accès.

69voto

tfinniga Points 3550

La plupart des processeurs modernes ont registres virgule flottante qui ont plus de 64 bits de précision. De cette façon, si vous exécutez plusieurs opérations sur les nombres double précision, vous obtenez en fait une plus grande précision de réponse que si vous étiez à tronquer chaque résultat intermédiaire à 64 bits.

C'est généralement grand, mais cela signifie que, en fonction de la manière dont le compilateur attribué registres et ne optimisations, vous aurez des résultats différents pour les mêmes opérations sur exactement les mêmes entrées. Si vous avez besoin de cohérence, vous pouvez forcer chaque opération pour revenir à la mémoire en utilisant le mot clé volatile.

Il est également utile pour certains algorithmes, qui n'ont pas de sens algébrique, mais de le réduire à virgule flottante erreur, comme Kahan sommation. Algebraicly c'est un nop, il sera souvent incorrectement optimisées, à moins que certaines variables intermédiaires sont volatiles.

59voto

MikeZ Points 241

À partir d'un des Systèmes Embarqués de l'Article de Dan Saks:

"Un volatile de l'objet est celui dont la valeur est susceptible d'évoluer spontanément. C'est, lorsque vous déclarez un objet à être volatile, vous avez dit au compilateur que l'objet pourrait changer d'état, même si aucune des instructions du programme semblent changer."

Liens à 2 articles par M. Saks concernant le mot clé volatile:

http://www.embedded.com/columns/programmingpointers/174300478 http://www.embedded.com/columns/programmingpointers/175801310

23voto

Vous DEVEZ utiliser volatile lorsque vous implémentez des structures de données sans verrouillage. Sinon, le compilateur est libre d’optimiser l’accès à la variable, ce qui changera la sémantique.

En d'autres termes, volatile indique au compilateur que les accès à cette variable doivent correspondre à une opération de lecture / écriture de la mémoire physique.

Par exemple, voici comment InterlockedIncrement est déclaré dans l'API Win32:

 LONG __cdecl InterlockedIncrement(
  __inout  LONG volatile *Addend
);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X