usar - token en c++
Arreglos volátiles en C y C++. (2)
Filipe Gonçalves ya ha proporcionado una respuesta, pero me gustaría elaborar un poco.
Básicamente, la palabra clave volátil se requiere cada vez que desea que su programa considere realmente el valor variable, sin intentar ser inteligente. No importa qué tipo de variable tenga, es solo que si el compilador no puede ver ningún cambio en una variable entre la asignación y la llamada, probablemente la optimizará (dependiendo de la configuración, por supuesto).
Desde el punto de vista del compilador, la secuencia de eventos es "assign 0 to Var"->"do unrelated stuff, but surely not touching Var"->"check Var value"
No importa dónde y cómo se declaró la variable Var, y el código será optimizado a menos que se utilice la palabra clave volatile
.
La palabra clave volátil se usa en C para evitar que el compilador realice ciertas optimizaciones, entre otros cambios sutiles, en una variable.
Por ejemplo;
volatile int my_int = 0;
crea un entero En algunas situaciones puede impedir la siguiente optimización:
while(my_int == 0); // Loop until my_int != 0
Optimizar para:
while(1); // Loop infinity.
Esto es útil para situaciones que incluyen las que se encuentran con frecuencia en sistemas integrados, como una situación en la que la modificación de una variable puede realizarse mediante una llamada a la función de interrupción. Hay muchos otros ejemplos de donde esta técnica es útil. my_int
puede ser una bandera modificada por dicha función. (Esto es sólo un modelo de juguete.)
Sin embargo, considere el caso donde los datos modificados por la función son una matriz. Los datos pueden ser apuntados por un puntero.
unsigned char* my_data = new unsigned char[256];
En este caso, teniendo en cuenta que my_data es una variable global en esta situación específica de esta pregunta [1], ¿la palabra clave volatile
redundante o sigue siendo necesaria?
[1] Puede que no importe.
Si la respuesta es que se requiere la palabra clave volátil, ¿cuál es la sintaxis correcta para su uso?
Por ejemplo, volatile unsigned char* my_data
, asumo que el puntero en sí es volátil y no los datos a los que apunta.
Finalmente, ¿hay alguna diferencia entre el uso en C y C ++?
Sí, se requiere volatile
, y la declaración correcta es:
volatile unsigned char *my_data;
Esto declara que my_data
es un puntero a carácter no firmado volátil.
Para hacer que el puntero en sí sea volátil, necesitarías esto en su lugar:
unsigned char *volatile my_data;
Y, por supuesto, tanto el puntero como los datos apuntados pueden ser volátiles:
volatile unsigned char *volatile my_data;
No hay diferencia entre C y C ++.