¿Hacer que una estructura sea volátil hace que todos sus miembros sean volátiles?

96

Si tengo:

struct whatever {
int data;
};
volatile whatever test;
será test.datavolátil también?

marca
fuente
4
Excelente pregunta. Leí que tener una volatilefunción miembro solo hace que el thispuntero sea volátil, por lo que los miembros se leerán de la memoria cada vez que se acceda a ellos, pero no son "oficialmente" volátiles.
Alexandre C.
2
Posiblemente un duplicado , pero sigue siendo una buena pregunta.
Sergei Tachenov

Respuestas:

119

Se puede hacer otra pregunta (o simplemente otra forma de ver la pregunta original):

¿Hacer una estructura consthace a todos sus miembros const?

Si tengo:

struct whatever { int data; };

const whatever test;

¿Test.data consttambién lo será ?

Mi respuesta es: si. Si se declara un objeto de tipo whatevercon el constentonces todos sus miembros serán constdemasiado

De manera similar, si declaras un objeto de tipo whatevercon volatile, todos sus miembros también lo serán volatile, al igual que si declaras el objeto con const, todos sus miembros también lo serán const.

consty volatileson dos caras de la misma moneda; son de modo que el Estándar a menudo se refiere a ellos como cv-qualifiers.


Citando del estándar ($ 7.1.5.1 / 8)

[Nota: volatile es una pista para la implementación para evitar una optimización agresiva que involucre al objeto porque el valor del objeto puede ser cambiado por medios indetectables por una implementación. Consulte 1.9 para conocer la semántica detallada. En general, se pretende que la semántica de volátil sea la misma en C ++ que en C.]

Eso significa que si su objeto es una instancia de una estructura, entonces el compilador no puede evitar una optimización agresiva que involucre al objeto , a menos que evite la optimización agresiva de cada uno de sus miembros. (De lo contrario, ¿de qué otra manera puede evitar la optimización que involucra al objeto?)


Tema relacionado:

¿Por qué usamos palabras clave volátiles en C ++?

Nawaz
fuente
Es importante señalar que la constancia se propaga solo a los miembros inmediatos. Si su estructura tiene un puntero a algún objeto, el puntero en sí será constante (por ejemplo, no podrá reasignarlo), pero podrá cambiar el objeto al que apunta. (asumiendo que su estructura no tiene un puntero a const)
Pablo Arias
-2

De: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx

Para declarar el objeto apuntado por el puntero como constante o volátil, use una declaración de la forma:

const char *cpch;
volatile char *vpch;

Para declarar el valor del puntero, es decir, la dirección real almacenada en el puntero, como constante o volátil, use una declaración de la forma:

char * const pchc;
char * volatile pchv;
Virtualmente real
fuente
3
No es una respuesta a la pregunta
Jakob van Bethlehem