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 un struct 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

Consulte también

Palabras clave
const
Punteros const y volatile