Share via


volatile (C++)

Un qualificateur de type que vous pouvez utiliser pour spécifier qu'un objet peut être modifié dans le programme par le matériel.

volatile declarator ;

Notes

Vous pouvez utiliser le commutateur de compilation d' /volatile pour modifier la manière dont le compilateur interprète ce mot clé.

Visual Studio interprète le mot clé d' volatile différemment selon l'architecture cible.Pour ARM, si aucune option du compilateur pour /volatile n'est spécifiée, le compilateur exécute comme si /volatile:iso a été spécifié.Pour les architectures autres que ARM, si aucune option du compilateur pour /volatile n'est spécifiée, le compilateur exécute comme si /volatile:ms a été spécifié ; par conséquent, car les architectures autres que ARM nous vous recommandons fortement que vous spécifiez /volatile:iso, et utilisons les primitives et les intrinsèques du compilateur explicites de synchronisation lorsque vous gérez la mémoire qui est partagée entre les threads.

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

Lorsque volatile est utilisé dans une variable qui a également le mot clé d' __restrict, volatile a la priorité.

Si un membre d' struct est marqué comme volatile, puis volatile est propagé à la structure entière.Si une structure n'a pas une longueur qui peut être copiée sur l'architecture active à l'aide d'une instruction, volatile peut être complètement détruit dans cette structure.

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

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

  • La longueur d' structconteneur externe (ou s'il est membre d' structprobablement imbriqué — dépasse la taille maximale pouvant être copiée sur l'architecture active à l'aide d'une instruction.

Bien que le processeur ne réorganise pas d'accès de l'ONU - pouvant être mis en cache, les variables l'ONU - pouvant être mis en cache doivent être marquées comme volatile pour garantir que le compilateur ne réorganise pas d'accès mémoire.

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

ISO conforme

Si vous êtes familiarisé avec le mot clé d' Volatile de C, ou l'familiarisé avec le comportement d' volatile dans les versions antérieures de Visual C++, sachez que le mot clé d' volatile standard) C++11 l'OIN est différent et est pris en charge dans Visual Studio lorsque l'option du compilateur pour /volatile:iso est spécifiée.(Pour ARM, elle est spécifié par défaut).Le mot clé d' volatile dans le code standard) C++11 l'OIN doit être utilisé uniquement pour l'accès au matériel ; n'utilisez pas pour la communication entre les threads d'.Pour la communication entre les threads, les mécanismes d'utilisation comme std::atomic<T> d' Modèles Standard C++.

Spécifique à Microsoft

Lorsque l'option du compilateur pour /volatile:ms est utiliser- par la valeur par défaut lorsque les architectures autres que ARM sont destinées - le le compilateur génère un code supplémentaire pour mettre à jour le classement entre les références aux objets volatile en plus de le classement de mise à jour des références à d'autres objets globaux.En particulier :

  • L'écriture dans un objet volatile (également appelé l'écriture volatile) a la sémantique de version finale ; autrement dit, une référence à un objet globale ou statique qui se produit avant que l'écriture dans un objet volatile dans la séquence d'instruction se produise avant volatile écrire dans le fichier binaire compilé.

  • Lecture d'un objet volatile (également appelée " volatile lu) a pour capturer la sémantique ; autrement dit, une référence à un objet globale ou statique qui se produit après avoir lu de la mémoire volatile dans la séquence d'instruction se produise ensuite ce volatile lu dans le fichier binaire compilé.

Cela permet aux objets volatile d'être utilisés pour des verrous et des versions finales de mémoire dans les applications multithread.

[!REMARQUE]

Lorsqu'il repose sur la cohérence améliorée fournie lorsque l'option du compilateur pour /volatile:ms est utilisée, le code est pas portable.

Voir aussi

Référence

Mots clés C++

const (C++)

pointeurs const et volatile