volatile (C++)
Calificador de tipo que puede utilizar para declarar que el hardware puede modificar un objeto en el programa.
Sintaxis
volatile declarator ;
Comentarios
Puede usar el modificador /volatile del compilador para modificar cómo interpreta el compilador esta palabra clave.
Visual Studio interpreta la palabra clave volatile
de manera diferente según la arquitectura de destino. En el caso de ARM, si no se especifica ninguna opción /volatile del compilador, este funciona como si se hubiera especificado /volatile:iso. En las arquitecturas distintas de ARM, si no se especifica ninguna opción /volatile del compilador, el compilador funciona como si se hubiera especificado /volatile:ms. Por tanto, para otras arquitecturas que no sean ARM, se recomienda encarecidamente especificar /volatile:iso y usar tipos primitivos de sincronización e intrínsecos del compilador explícitos al tratar con memoria que se comparte entre distintos subprocesos.
Se puede usar el calificador volatile
para proporcionar acceso a ubicaciones de memoria empleadas por procesos asincrónicos como controladores de interrupciones.
Cuando se usa volatile
en una variable que tiene también la palabra clave __restrict, tiene prioridad volatile
.
Si un miembro struct
está marcado como volatile
, volatile
se propaga a toda la estructura. Si una estructura no tiene una longitud que se pueda copiar en la arquitectura actual mediante una instrucción, se puede perder completamente volatile
en esa estructura.
La palabra clave volatile
puede no tener ningún efecto sobre un campo si se cumple una de las condiciones siguientes:
La longitud del campo volátil supera el tamaño máximo que se puede copiar en la arquitectura actual mediante una instrucción.
La longitud del
struct
contenedor exterior (o si es miembro de unstruct
posiblemente anidado) supera el tamaño máximo que se puede copiar en la arquitectura actual mediante una instrucción.
Aunque el procesador no reordena los accesos a memoria que no pueden almacenarse en la memoria caché, las variables que no pueden almacenarse en la memoria caché deben marcarse como volatile
para garantizar que el compilador no reordene los accesos a memoria.
Los objetos declarados como volatile
no se usan en ciertas optimizaciones porque sus valores pueden cambiar en cualquier momento. El sistema lee siempre el valor actual de un objeto volátil cuando se solicita, incluso aunque una instrucción anterior pidiera un valor del mismo objeto. Además, el valor del objeto se escribe inmediatamente en la asignación.
Conformidad con ISO
Si está familiarizado con la palabra clave volatile de C# o con el comportamiento de volatile
en versiones anteriores del compilador de Microsoft C++ (MSVC), tenga en cuenta que la palabra clave volatile
del estándar C++11 de ISO es diferente y se admite en MSVC cuando se especifica la opción /volatile:iso del compilador. (Para ARM, se especifica de forma predeterminada). La palabra clave volatile
en código del estándar C++11 de ISO se usa únicamente para el acceso de hardware; no la use para la comunicación entre subprocesos. Para la comunicación entre subprocesos, emplee mecanismos como std::atomic<T> de la biblioteca estándar de C++.
Fin de la conformidad con ISO
Específicos de Microsoft
Cuando se usa la opción /volatile:ms del compilador (de forma predeterminada, cuando el destino es una arquitectura distinta de ARM), el compilador genera código adicional para mantener el orden entre las referencias a objetos volátiles y el orden de las referencias a otros objetos globales. En concreto:
Una escritura en un objeto volátil (también conocida como escritura volátil) tiene liberación de semántica; es decir, una referencia a un objeto global o estático que se produce antes que una escritura en un objeto volátil en la secuencia de instrucciones se realice antes que esa escritura volátil en el binario compilado.
Una lectura de un objeto volátil (también conocida como lectura volátil) tiene adquisición de semántica; es decir, una referencia a un objeto global o estático que se produce después que una lectura de memoria volátil en la secuencia de instrucciones se realice después de esa lectura volátil en el binario compilado.
Esto permite utilizar objetos volátiles para bloqueos y liberaciones de memoria en aplicaciones multiproceso.
Nota:
Cuando se basa en la seguridad mejorada que se proporciona cuando se usa la opción /volatile:ms del compilador, el código es no portable.
FIN de Específicos de Microsoft