Excellente question. J'ai lu qu'avoir une volatilefonction membre ne fait que rendre le thispointeur volatil, donc les membres seront lus de la mémoire à chaque fois qu'ils sont accédés mais ne sont pas «officiellement» volatils.
Alexandre C.
2
Peut - être un double , mais toujours une bonne question.
Sergei Tachenov
Réponses:
119
Une autre question peut être posée (ou simplement une autre façon de regarder la question d'origine):
Est-ce que faire une structure constfait tous ses membres const?
Si j'ai:
struct whatever {int data;};const whatever test;
Est-ce que test.data le sera constaussi?
Ma réponse est: oui. Si vous déclarez un objet de type whateveravec constalors tous ses membres le seront constaussi
De même, si vous déclarez un objet de type whateveravec volatilealors tous ses membres le seront volatileaussi, tout comme si vous déclarez l'objet avec const, tout son membre le sera constaussi.
constet volatilesont deux faces de la même pièce; ils sont de sorte que la norme les appelle souvent cv-qualifiers.
Citation de la norme (7.1.5.1 / 8 $)
[Note: volatile est un indice à l'implémentation pour éviter une optimisation agressive impliquant l'objet
car la valeur de l'objet pourrait être modifiée par des moyens indétectables par une implémentation. Voir 1.9 pour une sémantique détaillée. En général, la sémantique de volatile est censée être la même en C ++ que dans C.]
Cela signifie que si votre objet est une instance d'une structure, le compilateur ne peut pas éviter une optimisation agressive impliquant l'objet , à moins qu'il n'évite une optimisation agressive de chacun de ses membres. (Sinon, comment éviter l'optimisation impliquant l'objet?)
Il est important de noter que la constness est propagée uniquement aux membres immédiats. Si votre structure contient un pointeur vers un objet, le pointeur lui-même sera const (par exemple, vous ne pourrez pas le réaffecter), mais vous pourrez changer l'objet pointé. (en supposant que votre structure ne pointe pas un pointeur vers const)
Pour déclarer l'objet pointé par le pointeur comme const ou volatile, utilisez une déclaration de la forme:
constchar*cpch;volatilechar*vpch;
Pour déclarer la valeur du pointeur - c'est-à-dire l'adresse réelle stockée dans le pointeur - comme const ou volatile, utilisez une déclaration de la forme:
volatile
fonction membre ne fait que rendre lethis
pointeur volatil, donc les membres seront lus de la mémoire à chaque fois qu'ils sont accédés mais ne sont pas «officiellement» volatils.Réponses:
Une autre question peut être posée (ou simplement une autre façon de regarder la question d'origine):
Est-ce que faire une structure
const
fait tous ses membresconst
?Si j'ai:
Est-ce que test.data le sera
const
aussi?Ma réponse est: oui. Si vous déclarez un objet de type
whatever
avecconst
alors tous ses membres le serontconst
aussiDe même, si vous déclarez un objet de type
whatever
avecvolatile
alors tous ses membres le serontvolatile
aussi, tout comme si vous déclarez l'objet avecconst
, tout son membre le seraconst
aussi.const
etvolatile
sont deux faces de la même pièce; ils sont de sorte que la norme les appelle souventcv-qualifiers
.Citation de la norme (7.1.5.1 / 8 $)
Cela signifie que si votre objet est une instance d'une structure, le compilateur ne peut pas éviter une optimisation agressive impliquant l'objet , à moins qu'il n'évite une optimisation agressive de chacun de ses membres. (Sinon, comment éviter l'optimisation impliquant l'objet?)
Sujet connexe:
Pourquoi utilisons-nous un mot clé volatile en C ++?
la source
De: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx
Pour déclarer l'objet pointé par le pointeur comme const ou volatile, utilisez une déclaration de la forme:
Pour déclarer la valeur du pointeur - c'est-à-dire l'adresse réelle stockée dans le pointeur - comme const ou volatile, utilisez une déclaration de la forme:
la source