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?)
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)
volatile
función miembro solo hace que elthis
puntero 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.Respuestas:
Se puede hacer otra pregunta (o simplemente otra forma de ver la pregunta original):
¿Hacer una estructura
const
hace a todos sus miembrosconst
?Si tengo:
¿Test.data
const
también lo será ?Mi respuesta es: si. Si se declara un objeto de tipo
whatever
con elconst
entonces todos sus miembros seránconst
demasiadoDe manera similar, si declaras un objeto de tipo
whatever
convolatile
, todos sus miembros también lo seránvolatile
, al igual que si declaras el objeto conconst
, todos sus miembros también lo seránconst
.const
yvolatile
son dos caras de la misma moneda; son de modo que el Estándar a menudo se refiere a ellos comocv-qualifiers
.Citando del estándar ($ 7.1.5.1 / 8)
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 ++?
fuente
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:
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:
fuente