Rendre une structure volatile rend-elle tous ses membres volatils?

96

Si j'ai:

struct whatever {
int data;
};
volatile whatever test;
sera test.dataaussi volatile?

marque
la source
4
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?)


Sujet connexe:

Pourquoi utilisons-nous un mot clé volatile en C ++?

Nawaz
la source
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)
Pablo Arias
-2

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:

const char *cpch;
volatile char *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:

char * const pchc;
char * volatile pchv;
Pratiquement réel
la source
3
Pas de réponse à la question
Jakob van Bethlehem