volatile
是一个和和const
对应的修饰符号. 表示这个变量可能被某种不被编译器控制的因素修改.比如操作系统,硬件和其他的线程.遇到这个关键字,则编译器对于关联这个变量的代码将不做优化,从而提供对特殊地址的稳定访问.声明语法为:int volatile vInt
.
编译器遇到变量vInt
的时候,即使刚刚访问过这个变量,编译器仍然对这个变量的初始内存地址进行访问,因为这个变量可能是时时变化的.
比如在程序中插入了一段汇编代码而编译器并不知道,此时对于访问的变量可以加上volatile
修饰符.
一般有三个地方需要使用这个修饰符:
- 多任务环境下任务共享的标志
- 硬件寄存器的访问
- 程序中供其他程序检测的变量.
volatile
指针
和const
类似,volatile
也有指针变量和变量指针两说.
- 对象,数据是
const
或者volatile
const char* cpch
volatile char* vpch
- 指针本身(一个整型变量)是
const
或者volatile
char* const pchc;
char* volatile pchv;
可以把一个非
volatile int
赋值给volatile int
,但是对象不行
多线程下的 volatile
两个线程共用一个变量的时候,这个变量必须要用volatile
修饰,以防止编译器优化,将寄存器中缓存的变量直接装入CPU 寄存器中.
volatile
保证了编译器每次都能直接从内存地址中直接访问某个变量,而不是从寄存器中. 保证了一些共享的标志位等数据的实时更新.