¿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;