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

Si tengo:

struct whatever { int data; }; 
volatile whatever test;

¿ test.data ser volátil también?

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

¿Hacer una estructura const hace que todos sus miembros sean const ?

Si tengo:

 struct whatever { int data; }; const whatever test; 

¿Test.data también será const ?

Mi respuesta es: Sí. Si declaras un objeto de tipo whatever con const entonces todos sus miembros serán const también

Del mismo modo, si declara un objeto de tipo whatever con volatile , todos sus miembros también serán volatile , al igual que si declara el objeto con const , todo su miembro será const también.

const y volatile son dos caras de la misma moneda; son para que el Estándar a menudo se refiera a ellos como cv-qualifiers .


Citando del estándar ($ 7.1.5.1 / 8)

[Nota: volátil es una sugerencia para la implementación para evitar la optimización agresiva que involucra el objeto porque el valor del objeto puede ser cambiado por medios indetectables por una implementación. Ver 1.9 para una semántica detallada. En general, la semántica de los volátiles debe ser la misma en C + + que en C.]

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


Tema relacionado:

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

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

Para declarar el objeto apuntado por el puntero como const o volátil, use una statement 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 const o volátil, use una statement de la forma:

 char * const pchc; char * volatile pchv;