简介

​ volatile 意为:不稳定的,易变的。该关键字用于提醒编译器它所修饰的变量的值会时刻改变。通常我们不会经常使用该关键字修饰变量,那么这个时候为了优化IO性能,程序可能会从该变量的寄存器中取值而不会从它的内存地址取值,因为访问寄存器的性能快过ram,但如果数据会频繁变化,寄存器中的值和该变量的内存地址中的值就并不一定完全相同,这样就会导致数据不一致,容易出现问题,且难以发现。

用法

volatile <data-type> <var-name>;

volatile int a = 0;

示例

​ 比如我想用整形变量定义一个flag,而该flag会一直变化,当达到某个条件会断开循环,如果不加volatile关键字,就容易导致数据不一致,循环可能不会像预期的那样运行

1
2
3
4
5
6
7
#include <iostream>
int flag = 0;
int main(){
while(flag != 0){ func1(); }
func2();
return 0;
}
1
2
3
4
5
6
7
#include <iostream>
volatile int flag = 0;
int main(){
while(flag != 0){ func1(); }
func2();
return 0;
}

通常Debug模式和Release模式中,使用和不使用volatile关键字程序运行状态可能会有所不一样,因为不同模式编译器编译优化会不一样,Release模式会优化代码,运行时就有可能导致会从寄存器中读取数据,那么就会产生问题出来。