Última actualización:2026-10-12
La palabra clave volatile en C++¶
Sobre el autor:¶
Cuenta pública personal:

1. volatile¶
Las variables modificadas con volatile, al ser leídas o escritas, provocan algunos efectos laterales observables. Y esos efectos laterales observables están determinados por factores externos al programa.
2. Aplicaciones de volatile¶
(1) Registros de hardware de dispositivos en paralelo (por ejemplo, el registro de estado). Supongamos que queremos inicializar un dispositivo cuyo registro está en 0xff800000.
int *output = (unsigned int *)0xff800000; //定义一个IO端口;
int init(void)
{
int i;
for(i=0;i< 10;i++)
{
*output = i;
}
}
(2) Variables a las que se accede desde una rutina de servicio de interrupción;
static int i=0;
int main()
{
while(1)
{
if(i) dosomething();
}
}
/* Interrupt service routine */
void IRS()
{
i=1;
}
(3) Variables compartidas por varias tareas en aplicaciones multihilo. Cuando varios hilos comparten una variable cuyo valor puede ser cambiado por cualquiera de ellos, debe declararse con volatile. Su función es impedir que el compilador, al optimizar, cargue la variable de la memoria a un registro de la CPU, lo que provocaría errores si un hilo cambia la variable y no se sincroniza a tiempo con los demás hilos. volatile significa que el compilador, en cada operación sobre esa variable, debe extraerla realmente de la memoria y no usar el valor que ya esté en un registro. Un ejemplo:
volatile bool bStop=false; //bStop 为共享全局变量
//第一个线程
void threadFunc1()
{
...
while(!bStop){...}
}
//第二个线程终止上面的线程循环
void threadFunc2()
{
...
bStop = true;
}
Saber cuáles son los escenarios de aplicación de volatile es una forma eficaz de distinguir a un programador de C/C++ de un programador de desarrollo embebido: los que trabajan en embebidos tratan a menudo con hardware, interrupciones, RTOS, etc., y todo ello exige usar variables volatile; no entender volatile trae consigo desastres en el diseño de programas.
3. Preguntas frecuentes sobre volatile¶
Con las siguientes preguntas se puede ver si un candidato entiende de verdad volatile. (1) ¿Puede un parámetro ser a la vez const y volatile? ¿Por qué? Sí. Un ejemplo es un registro de estado de solo lectura. Es volatile porque puede cambiar de forma inesperada. Es const porque el programa no debería intentar modificarlo.
(2) ¿Puede un puntero ser volatile? ¿Por qué? Sí, aunque no es habitual. Un ejemplo es cuando una rutina de servicio de interrupción modifica un puntero que apunta a un buffer.
(3) ¿Qué error tiene la siguiente función?
Este código es un poco retorcido: su propósito es devolver el cuadrado del valor apuntado por el puntero ptr, pero como ptr apunta a un parámetro de tipo volatile, el compilador generará algo como lo siguiente: Como el valor de *ptr puede cambiar de forma inesperada, a y b pueden ser distintos. En consecuencia, ¡este código puede no devolver el cuadrado que esperas! El código correcto es el siguiente:4. Uso de volatile¶
-
La palabra clave volatile es un modificador de tipo; las variables del tipo declarado con ella indican que pueden ser cambiadas por factores desconocidos para el compilador (sistema operativo, hardware, otros hilos, etc.). Por eso, usar volatile indica al compilador que no debe optimizar dichos objetos.
-
Las variables declaradas con la palabra clave volatile deben extraer su valor de la memoria en cada acceso (las variables no modificadas con volatile pueden, por la optimización del compilador, tomar su valor de un registro de la CPU)
- const puede ser volatile (por ejemplo, un registro de estado de solo lectura)
- Un puntero puede ser volatile
Código para estudiar:
Temas relacionados¶
- Funciones virtuales puras y clases abstractas en C++ | C++那些事
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- Implementar el polimorfismo de C++ en lenguaje C | C++那些事
- const en C++: constantes y modificación | C++那些事
- La familia completa de const en C++ | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事