Question

J'ai une question sur la différence entre volatilité et mutable. J'ai remarqué que les deux des deux moyens qu'il pourrait être modifié. Quoi d'autre? Sont-ils la même chose? Quelle est la différence? Où sont-ils applicables? Pourquoi les deux idées sont proposées? Comment les utiliser de manière différente?

Merci beaucoup.

Était-ce utile?

La solution

Un champ de mutable peut être modifiée, même dans un objet accessible via un pointeur de const ou de référence, ou dans un objet const, de sorte que le compilateur sait pas pour ranger en mémoire de R / S. Un emplacement de volatile est celui qui peut être modifié par le code du compilateur ne sait pas (par exemple certains pilotes au niveau du noyau), de sorte que le compilateur ne sait pas optimiser par exemple inscrire la cession de cette valeur dans l'hypothèse que la valeur invalide « ne peut peut-être changé » depuis la dernière chargée dans ce registre. très différent de l'info étant donné au compilateur d'arrêter les types très différents d'optimisations non valides.

Autres conseils

mutable: Le mot-clé mutable remplace toute déclaration renfermant const. Un élément d'un objet mutable const peut être modifié.

volatile: Le mot-clé volatile est un modificateur dépendant de l'implémentation, utilisé lors de la déclaration des variables, ce qui empêche le compilateur d'optimiser ces variables. Volatile doit être utilisé avec des variables dont la valeur peut changer de façon inattendue (par exemple par le biais d'une interruption), ce qui pourrait entrer en conflit avec des optimisations que le compilateur peut effectuer.

Source

Ils ne sont certainement pas la même chose. Mutables interagit avec const. Si vous avez un pointeur const, vous pouvez normalement pas changer les membres. Mutable prévoit une exception à cette règle.

Volatile, d'autre part, est totalement sans rapport avec les modifications apportées par le programme. Cela signifie que la mémoire pourrait changer pour des raisons indépendantes de la volonté du compilateur, donc le compilateur doit lire ou écrire l'adresse mémoire à chaque fois et ne peut pas mettre en cache le contenu dans un registre.

Une façon grossière mais efficace de la pensée de la différence est:

  • Le compilateur sait quand un objet change mutable.
  • Le compilateur ne peut pas savoir quand un objet change volatile.

Une variable mutable marquée permet d'être modifiée dans un procédé déclaré const.

Une variable marquée volatile indique au compilateur qu'il doit lire / écrire la variable chaque fois que votre code indique aussi (à savoir qu'il ne peut pas optimiser l'écart accès à la variable).

Je voudrais ajouter que volatile est également très utile pour le traitement des demandes de multithreading, par exemple, vous avez votre thread principal (où main () vit) et vous frayer un thread de travail qui gardera la filature alors qu'une variable « app_running » est vrai. main () contrôle si « app_running » est vrai ou faux, donc si vous n'ajoutez pas l'attribut volatile à la déclaration de « app_running », si le compilateur optimise l'accès à « app_running » dans le code couru par le fil secondaire, principal ( ) pourrait changer « app_running » false mais le fil secondaire continuera à fonctionner parce que la valeur a été mis en cache. Je l'ai vu le même comportement en utilisant gcc sous Linux et VisualC ++. Un attribut « volatile » mis dans la déclaration « de app_running » a résolu le problème. Donc, c'est le scénario où aucune interruption du matériel ou noyau est invoved en changeant la valeur de ces variables.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top