volatile是易变的、不稳定的意思。有些人根本没见过这个关键字,也有的程序员知道他的存在,但没有使用过它,嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所有这些都要求使用volatile变量。不懂得volatile内容将会带来灾难。
1 volatile由来cpu对内存的访问速度远不及寄存器,为了提高机器性能,编译器一般都会作减少存取内存的优化,将内存变量缓存到寄存器。当用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据, 即使之前的指令刚刚从该处读取过数据,从而可以提供对特殊地址的稳定访问。
即:编译器对volatile声明的变量不再优化,始终从内存地址读取数据。
2 举例不使用volatile
int x = 23;int j = x; //1int i = x; //2/*编译器优化之后,执行指令1,从内存中取出x值执行指令2,从寄存器中取出x值*/
使用volatile
volatile int x = 23;int j = x; //1int i = x; //2/*编译器无优化执行指令1,从内存中取出x值执行指令2,从内存中取出x值*/
这样看来,如果x是多个线程的共享数据,就容易出错,所以说volatile可以保证对特殊地址的稳定访问。
3 用途多个线程共享的数据
中断服务程序中修改的变量,供其他程序访问的变量
并行设备的硬件寄存器
注意
在VC++6.0中,一般Debug模式没有进行代码优化,所以这个关键字的作用有可能看不出来。
频繁地使用volatile很可能会增加代码尺寸和降低性能,因此要合理的使用volatile 。
END
![3d4c6de8df74058307ab373b73b74ec6.gif](https://img-blog.csdnimg.cn/img_convert/3d4c6de8df74058307ab373b73b74ec6.gif)
![507e93fafd1ec5f5cd6a2fc29b7c46ed.png](https://img-blog.csdnimg.cn/img_convert/507e93fafd1ec5f5cd6a2fc29b7c46ed.png)
![3d4c6de8df74058307ab373b73b74ec6.gif](https://img-blog.csdnimg.cn/img_convert/3d4c6de8df74058307ab373b73b74ec6.gif)