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
struct
le 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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour