c++ volatile

¿Por qué es ''volátil'' parásito en C++?



volatile (2)

En C ++, la palabra clave volatile aplica los mismos tipos de restricción en lo que puede hacer como lo hace const . La Norma se refiere a esto como ''calificación cv'' como en ''calificación const / volatile. Consts solo puede ser usado por consts, y de la misma manera los volátiles solo pueden ser usados ​​por los volátiles.

Como punto de partida, esto puede ayudarlo a escribir código de multiproceso. No en virtud de emplear alguna magia de compilación que hace que su variable sea repentinamente atómica o algo así, sino forzándolo a actuar solo sobre datos volátiles de manera volátil. Vea este artículo de Alexandrescu para más información.

Considere el siguiente código:

int main() { int i; volatile int* p = &i; int *v = p; return 0; }

Esto da un error en g++ :

$ g++ -o volatile volatile.cpp volatile.cpp: In function ‘int main()’: volatile.cpp:6: error: invalid conversion from ‘volatile int*’ to ‘int*’

Mi intención era que quisiera hacer p volátil. Sin embargo, una vez que he leído el valor de p , no me importa si acceder a v es volátil. ¿Por qué se requiere que v se declare volátil?

Este es un código hipotético, por supuesto. En una situación real, podría imaginar que p apunta a una ubicación de memoria, pero se modifica externamente y quiero que v apunte a la ubicación que p apunta en el momento de v = p , incluso si posteriormente se modifica externamente p . Por lo tanto, p es volátil, pero v no lo es.

Por cierto, estoy interesado en el comportamiento cuando se considera C y C ++, pero en C solo genera una advertencia, no un error.


Si quiere decir que el puntero debe ser volátil, en lugar del objeto al que apunta, entonces declare como

int* volatile p;