84 votes

volatile vs mutable en C ++

J'ai une question sur la différence entre volatile et mutable. J'ai remarqué que cela signifie que cela pourrait être changé. 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.

111voto

Alex Martelli Points 330805

Un mutable champ peut être modifié, même dans un objet accessible par un const de pointeur ou de référence, ou dans un const de l'objet, de sorte que le compilateur ne sait pas à ranger dans R/S de la mémoire. Un volatile emplacement est celui qui peut être changé par le code que le compilateur ne sait pas (par exemple, certains au niveau du noyau du pilote), de sorte que le compilateur ne sait pas pour optimiser par exemple de vous inscrire affectation de la valeur sous l'hypothèse valide que la valeur "ne peut pas avoir changé" depuis qu'il a été chargé dans ce registre. Genre très différent de l'info étant donné le compilateur pour arrêter de types très différents d'invalide optimisations.

27voto

xian Points 2714

mutable: Le mot-clé mutable remplace les enfermant instruction const. Une mutable membre d'un const objet peut être modifié.

volatile: Le mot clé volatile est un dépendant de l'implémentation modificateur utilisé lors de la déclaration de 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 (c'est à dire par une interruption), qui pourrait entrer en conflit avec les optimisations que le compilateur peut effectuer.

Source

22voto

Ben Voigt Points 151460

Ce ne sont certainement pas la même chose. Mutable interagit avec const. Si vous avez un pointeur const, vous ne pouvez normalement pas changer de membre. Mutable fournit une exception à cette règle.

La volatilité, en revanche, est totalement indépendante des modifications apportées par le programme. Cela signifie que la mémoire peut changer pour des raisons indépendantes de la volonté du compilateur. Le compilateur doit donc lire ou écrire l'adresse mémoire à chaque fois et ne peut pas mettre en cache le contenu dans un registre.

17voto

Jonathan Leffler Points 299946

Une façon brute mais efficace de penser à la différence est:

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

11voto

Kyle Lutz Points 4792

Une variable marquée mutable permet de la modifier selon une méthode déclarée const .

Une variable marquée volatile indique au compilateur qu'il doit lire / écrire la variable chaque fois que votre code le dit également (c.-à-d. Qu'elle ne peut pas optimiser les accès à la variable).

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