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.