volatile的解析

来源:互联网 发布:node 捕捉子进程错误 编辑:程序博客网 时间:2024/05/29 11:25

volatile关键字是一种类型的修饰符,用它声明变量表示可以被某些编译器更改,volatile变量影响编译器的输出结果。

一般来说,volatile用在如下的几个地方:

1 、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各种任务间共享的标志应该加volatile

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都有可能是不同的意义;


volatile关键字声明的变量,编译器(compiler)对访问该变量的代码就不再不做任何的优化,从而达到对特殊地址的稳定访问。

例如:

void main(void){

volatile int i  ;

int j;

i = 1;(不被优化)

i = 2;(不被优化)

j = 1;(被优化)

j = 2; 

}

优化的结果如下:

void main(void){

volatile int i  ;

int j;

i = 1;

i = 2;

j = 2; 

}

有结果可知,j = 1 指令丢失,如果是使用volatile则compiler就不会做任何的优化,从而保证程序的原意。


使用volatile定义的变量在程序外被改变,每次都要从内存中读取.

例如:

volatile int a;

 a= 0;

while(!a){

..........

}

do_something();

如果没有volatile的时候,当while函数里a的值被改变时,do_something函数也不会执行,因为a的值没有从内存中读取,所以a的值没有改变,一直是0。

当有volatile的时候,当while函数里a的值被改变时,使用时都要从a的内存地址中读取,从而跳出while循环体,执行do_something函数。


原创粉丝点击