关于volatile关键字的说明以及测试

2016-01-29 12:24 14 1 收藏

关于volatile关键字的说明以及测试,关于volatile关键字的说明以及测试

【 tulaoshi.com - C语言心得技巧 】

关于volatile关键字的说明以及测试

作者:九月鹰飞

  volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

使用该关键字的例子如下:

int volatile nVint;

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

例如:

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)
#include <stdio.hvoid main(){int i=10;int a = i;printf("i= %dn",a);//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道__asm {mov dword ptr [ebp-4], 20h}int b = i;printf("i= %dn",b);}      

然后,在调试版本模式运行程序,输出结果如下:

i = 10i = 32

然后,在release版本模式运行程序,输出结果如下:

i = 10i = 10

输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。下面,我们把 i的声明加上volatile关键字,看看有什么变化:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)
#include <stdio.hvoid main(){volatile int i=10;int a = i;printf("i= %dn",a);__asm {mov dword ptr [ebp-4], 20h}int b = i;printf("i= %dn",b);}      

分别在调试版本和release版本运行程序,输出都是:

i = 10i = 32

这说明这个关键字发挥了它的作用!
iwaswzq 于2004/12/4/16:15

来源:https://www.tulaoshi.com/n/20160129/1485970.html

延伸阅读
彻底理解this 关键字的含义 this关键字再java里面是一个我认为非常不好理解的概念,:)也许是太笨的原因 this 关键字的含义:可为以调用了其方法的那个对象生成相应的句柄。 怎么理解这段话呢? thinking in java里面有这么一个例子 有两个同一个类型的对象,分别叫做a和b,那我们怎样区别在调用方法f()的时候...
C++中的 static 关键字 作者:陈厚辉 前言: 本文只是本人对C++中关于静态类型的一个总结,如错误之处,请大家帮我改正。我分两个方面来总结,第一方面主要是相对于面向过程而言,即在这方面不涉及到类,第二方面相对于面向对象而言,主要说明static在类中的作用。 一、在面向过...
标签: Web开发
关键字“拖曳搜索”之“拖曳”功能需要 jQuery UI 之 droppable 库 效果如下: 搜索包含相关关键字时,把拖曳左边关键字到右边框里面 也可以在输入框里输入自定义关键字到下面框 即可搜索 如果去掉不需要的关键词 搜索时 把不需要的关键词从右边框拖曳回到左边 即可 无论原来还是自定义加入的关键词 如果已存在 她会提示... 实...
static和const两个关键字,好像都是跟静态有关,初学时易于混淆不算,实际用的时候也是能不用就不用,反正用这两个关键字的机会也少,而且不用也可以,呵呵,这种想法也不是我一个人有的,几乎所有人这么做时也不是想了想才决定的,此事无关风月,关乎天性,呵呵. 首先一定要弄清楚的是,static关键字修饰的成员虽然叫静态成员,却并非是不可改的,如果有...
Java 关键字列表 (依字母排序 共51组): abstract, assert,boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, enum,extends, final, finally, float, for, if, implements, import, instanceof, int, interface, long, native, new, package, private, protected, public, return, short, static, ...

经验教程

453

收藏

42
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部