qualifier c++ volatile member-functions

qualifier - Funciones miembro C++ volátiles



c++ cv qualifier (5)

El siguiente código:

#include <iostream> class Bar { public: void test(); }; class Foo { public: void test() volatile { x.test(); } private: Bar x; }; int main() { Foo foo; foo.test(); return 0; }

Se produce un error al compilar con gcc:

main.cpp: In member function ''void Foo::test() volatile'': main.cpp:14:33: error: no matching function for call to ''Bar::test() volatile'' main.cpp:7:8: note: candidate is: void Bar::test() <near match>

Y dado que una instancia volatile no puede llamar a un método non-volatile , podemos suponer que, sí, x e y serán volatile en el método, incluso si la instancia de MyClass no se declara volatile .

Nota: puede eliminar el calificador volatile usando un const_cast<> si alguna vez lo necesita; sin embargo, tenga cuidado porque al igual que const hacerlo puede conducir a un comportamiento indefinido en algunos casos.

class MyClass { int x, y; void foo() volatile { // do stuff with x // do stuff with y } };

¿Debo declarar que ''x'' e ''y'' son volátiles o que todas las variables miembro se tratarán como volátiles automáticamente?

Quiero asegurarme de que "cosas con ''x''" no sean reordenadas con "cosas con ''y''" por el compilador.

EDITAR: ¿Qué sucede si estoy convirtiendo un tipo normal en un tipo volátil? ¿Esto instruiría al compilador a no reordenar el acceso a esa ubicación? Quiero pasar una variable normal en una situación especial a una función cuyo parámetro es volátil. Debo estar seguro de que el compilador no reordena esa llamada con lecturas y escrituras anteriores o seguidas.


Entonces usando el ejemplo original:

class MyClass { int x, y; void foo() volatile { // do stuff with x // do stuff with y // with no "non-volatile" optimization of the stuff done with x, y (or anything else) } void foo() { // do stuff with x // do stuff with y // the stuff done with x, y (and anything else) may be optimized } };


Marcar una función miembro volatile es como marcarla const ; significa que el objeto receptor se trata como si se hubiera declarado como una volatile T* . Consecuentemente, cualquier referencia a x o y se tratará como una lectura volatile en la función de miembro. Además, un objeto volatile solo puede llamar a funciones miembro volatile .

Dicho esto, es posible que desee marcar x y y volatile todos modos si realmente desea que todos los accesos a ellos sean tratados como volatile .


No tiene que declarar explícitamente las variables miembro.

De los documentos estándar 9.3.2.3 ,

De forma similar, la semántica volátil (7.1.6.1) se aplica en las funciones de miembros volátiles cuando se accede al objeto y a sus miembros de datos no estáticos.


IBM implica que funciona exactamente igual que las funciones const.