c语言volatile:c语言中的volatile关键字

volatile关键字是种类型修饰符用它声明类型变量表示可以被某些编译器未知原因更改

用volatile关键字声明变量i每次被访问时执行部件都会从i相应内存单元中取出i

没有用volatile关键字声明变量i在被访问时候可能直接从cpu寄存器中取值(的前i被访问过也就是说的前就从内存中取出i值保存到某个寄存器中)的所以直接从寄存器中取值而不去内存中取值编译器优化代码结果(访问cpu寄存器比访问ram快多)

以上两种情况区别在于被编译成汇编代码的后两者是不的所以这样做是变量i可能会经常变化保证对特殊地址稳定访问



volatile关键字是种类型修饰符用它声明类型变量表示可以被某些编译器未知原因更改

比如:操作系统、硬件或者其它线程等遇到这个关键字声明变量编译器对访问该变量

代码就不再进行优化从而可以提供对特殊地址稳定访问

使用该关键字例子如下:
volatile nV;
  

当要求使用volatile 声明变量时候系统总是重新从它所在内存读取数据即使它前面指令刚刚从该处读取过数据而且读取数据立刻被保存

例如:
volatile i=10;
a = i;
...
//其他代码并未明确告诉编译器对i进行过操作

b = i;
  

volatile 指出 i是随时可能发生变化每次使用它时候必须从i地址中读取因而编译器生成汇编代码会重新从i地址读取数据放在b中而优化做法是由于编译器发现两次从i读数据代码的间代码没有对i进行过操作它会自动把上次读数据放在b中而不是重新从i里面读这样以来如果i是个寄存器变量或者表示个端口数据就容易出错所以说volatile可以保证对特殊地址稳定访问
  注意在vc6中般调试模式没有进行代码优化所以这个关键字作用看不出来下面通过插入汇编代码测试有无volatile关键字最终代码影响:
  首先wizard建个win32 console工程插入个voltest.cpp文件输入下面

代码:
 
#i nclude <stdio.h>
void
{
i=10;
a = i;

prf("i= %d\n",a);
//下面汇编语句作用就是改变内存中i但是又不让编译器知道
__asm {
mov dword ptr [ebp-4], 20h
}

b = i;
prf("i= %d\n",b);
}
然后在调试版本模式运行输出结果如下:
i = 10
i = 32
然后在release版本模式运行输出结果如下:
i = 10
i = 10
输出结果明显表明release模式下编译器对代码进行了优化第 2次没有输出正确i值

下面我们把 i声明加上volatile关键字看看有什么变化:
#i nclude <stdio.h>
void
{
volatile i=10;
a = i;

prf("i= %d\n",a);
__asm {
mov dword ptr [ebp-4], 20h
}

b = i;
prf("i= %d\n",b);
}
分别在调试版本和release版本运行输出都是:
i = 10
i = 32
这介绍说明这个关键字发挥了它作用!
Tags:  c语言中是什么意思 c语言中 c语言volatile

延伸阅读

最新评论

发表评论