volatile (C++)

Qualificateur de type que vous pouvez utiliser pour déclarer qu'un objet peut être modifié dans le programme par le matériel.

Syntaxe

volatile declarator ;

Notes

Vous pouvez utiliser le commutateur du compilateur /volatile pour modifier la façon dont le compilateur interprète cette mot clé.

Visual Studio interprète le volatile mot clé différemment en fonction de l’architecture cible. Pour ARM, si aucune option de compilateur /volatile n’est spécifiée, le compilateur effectue comme si /volatile :iso a été spécifié. Pour les architectures autres que ARM, si aucune option de compilateur /volatile n’est spécifiée, le compilateur effectue comme si /volatile :ms a été spécifié. Par conséquent, pour les architectures autres que ARM, nous vous recommandons vivement de spécifier /volatile :iso et d’utiliser des primitives de synchronisation explicites et des intrinsèques du compilateur lorsque vous traitez de la mémoire partagée entre les threads.

Vous pouvez utiliser le qualificateur pour fournir l’accès volatile aux emplacements de mémoire utilisés par des processus asynchrones tels que des gestionnaires d’interruptions.

Lorsqu’elle volatile est utilisée sur une variable qui a également la __restrict mot clé, volatile est prioritaire.

Si un struct membre est marqué comme volatile, il volatile est propagé à l’ensemble de la structure. Si une structure n’a pas de longueur qui peut être copiée sur l’architecture actuelle à l’aide d’une instruction, volatile elle peut être complètement perdue sur cette structure.

Le volatile mot clé peut ne pas avoir d’effet sur un champ si l’une des conditions suivantes est remplie :

  • La longueur du champ volatile dépasse la taille maximale pouvant être copiée sur l'architecture actuelle en utilisant une instruction.

  • La longueur du conteneur structle plus externe ( ou s’il s’agit d’un membre d’un peut-être imbriqué struct) dépasse la taille maximale qui peut être copiée sur l’architecture actuelle à l’aide d’une seule instruction.

Bien que le processeur ne réorganise pas les accès à la mémoire non mis en cache, les variables non mises en cache doivent être marquées pour volatile garantir que le compilateur ne réorganise pas les accès à la mémoire.

Les objets déclarés comme volatile ne sont pas utilisés dans certaines optimisations, car leurs valeurs peuvent changer à tout moment. Le système lit toujours la valeur actuelle d'un objet volatile lorsque la demande en est faite, même si une instruction précédente a demandé une valeur du même objet. De même, la valeur de l'objet est écrite immédiatement sur l'assignation.

Conforme iso

Si vous connaissez le mot clé volatile C# ou que vous connaissez bien le comportement du volatile compilateur Microsoft C++ (MSVC), sachez que le mot clé ISO Standard volatile C++11 est différent et est pris en charge dans MSVC lorsque l’option du compilateur /volatile :iso est spécifiée. (Pour ARM, elle est spécifiée par défaut). La volatile mot clé du code ISO C++11 doit être utilisée uniquement pour l’accès matériel ; ne l’utilisez pas pour la communication entre threads. Pour la communication entre threads, utilisez des mécanismes tels que std ::atomic<T> à partir de la bibliothèque standard C++.

Fin de la conformité ISO

Section spécifique à Microsoft

Lorsque l’option du compilateur /volatile :ms est utilisée par défaut lorsque les architectures autres que ARM sont ciblées, le compilateur génère du code supplémentaire pour maintenir l’ordre entre les références aux objets volatiles, en plus de maintenir l’ordre des références à d’autres objets globaux. En particulier :

  • L’écriture dans un objet volatile (également appelée "écriture volatile") a une sémantique Release, c’est-à-dire, une référence à un objet global ou statique qui se produit avant qu’une écriture dans un objet volatile de la séquence d’instructions ne se produise avant cette écriture volatile dans le fichier binaire compilé.

  • La lecture d'un objet volatile (également appelée "lecture volatile") a une sémantique Acquire, c'est-à-dire, une référence à un objet global ou statique qui se produit après qu'une lecture de la mémoire volatile dans la séquence d'instructions se produit après cette lecture volatile dans le fichier binaire compilé.

Cela permet aux objets volatiles d'être utilisés pour les verrous et les libérations de mémoire dans les applications multithread.

Remarque

Lorsqu’il s’appuie sur la garantie améliorée fournie lorsque l’option du compilateur /volatile :ms est utilisée, le code n’est pas portable.

FIN de la section spécifique à Microsoft

Voir aussi

Mots clés
const
const et volatile, pointeurs