博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助 

小鱼儿's blog

——我是一只鱼。。。
xiaofish229.cublog.cn
关于作者  
姓名:小鱼儿
职业:学生
年龄:24
位置:北京
个性介绍:一天到晚游泳的鱼!

我现在已经毕业了,刚参加工作,很忙啊!
好久没来了,看大家一直都在关心我的博客,很感动啊,多谢大家的支持,看到我的文章能给大家带来帮助很开心哦!
我的QQ群已经满了,不能再加入了,对不起哦!

如果您觉得本Blog中的文章对您有所帮助,请留言支持一下!

选择匿名就不用输用户名和密码了!

欢迎大家一起讨论VxWorks相关问题!

QQ:106406495
邮箱:xiaofish229@163.com
VxWorks交流讨论群:34416847

我的分类  




c语言中volatile关键字

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

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

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

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

=====以下为转载======

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是一个寄存器变量或者表示一个端口数据就容易出错,所以说vola

tile可以保证对特殊地址的稳定访问。
  注意,在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面

通过插入汇编代码,测试有无volatile关键字,对程序最终代码的影响:
  首先,用classwizard建一个win32 console工程,插入一个voltest.cpp文件,输入下面的

代码:
 
#i nclude <stdio.h>
void main()
{
 int i=10;
 int a = i;
 
 printf("i= %d\n",a);
 //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
 __asm {
  mov dword ptr [ebp-4], 20h
 }
 
 int b = i;
 printf("i= %d\n",b);
}     
然后,在调试版本模式运行程序,输出结果如下:
i = 10
i = 32
然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10
输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。

下面,我们把 i的声明加上volatile关键字,看看有什么变化:
#i nclude <stdio.h>
void main()
{
 volatile int i=10;
 int a = i;
 
 printf("i= %d\n",a);
 __asm {
  mov dword ptr [ebp-4], 20h
 }
 
 int b = i;
 printf("i= %d\n",b);
}     
分别在调试版本和release版本运行程序,输出都是:
i = 10
i = 32
这说明这个关键字发挥了它的作用!

 原文地址 http://hi.baidu.com/cylient/blog/item/1bfc2fdd1aab6dd98d1029df.html
 发表于: 2007-01-28,修改于: 2007-01-28 11:20
 已浏览9609次,有评论34条
推荐 投诉

  网友评论
  本站网友 时间:2007-03-01 11:08:08 IP地址:60.191.62.★


  本站网友 时间:2007-04-05 22:46:10 IP地址:202.38.202.★
呵呵,学到东西了,谢谢哦

你是学什么的?

  本站网友 时间:2007-06-02 21:56:14 IP地址:59.64.76.★
不错,我倒过来顶!

  本站网友 时间:2007-09-03 15:56:04 IP地址:218.4.115.★
顶 顶

  本站网友 时间:2007-10-10 09:34:56 IP地址:221.200.134.★
路过,顶一个

  本站网友 时间:2008-01-11 21:00:10 IP地址:124.128.158.★
呵呵,总之一句话,保证不被编译器代码优化。我是做Linux的,顶一下啦

  本站网友 时间:2008-05-05 17:09:42 IP地址:211.157.41.★
顶一个

  本站网友 时间:2008-07-22 13:39:51 IP地址:202.38.78.★
写得好!!!

  本站网友 时间:2008-08-26 17:10:15 IP地址:222.92.90.★
恩,顶了

  本站网友 时间:2008-09-04 14:49:32 IP地址:221.122.78.★
写的很好,受教了!

  本站网友 时间:2008-09-04 15:09:56 IP地址:202.202.66.★
学无止境、、、

  本站网友 时间:2008-10-28 18:46:08 IP地址:202.118.75.★
很好很强大
学到知识了
谢谢

  本站网友 时间:2008-11-12 17:39:05 IP地址:124.193.131.★
谢谢

  本站网友 时间:2008-11-18 13:52:42 IP地址:125.70.69.★
好,谢谢楼主.

  本站网友 时间:2008-11-19 20:18:11 IP地址:222.66.119.★
不错额

  本站网友 时间:2008-12-11 23:01:10 IP地址:117.39.56.★
谢谢,非常实用

  本站网友 时间:2008-12-16 00:06:09 IP地址:221.218.191.★
顶!!!!!!!!!!!!!!

  本站网友 时间:2008-12-25 10:03:42 IP地址:123.139.66.★
ding 

  本站网友 时间:2009-01-19 23:04:52 IP地址:222.130.185.★
 不错。

  本站网友 时间:2009-02-13 16:49:22 IP地址:124.72.77.★
 看了

  本站网友 时间:2009-02-25 17:03:09 IP地址:218.75.242.★
很好啊

  本站网友 时间:2009-02-25 20:02:26 IP地址:202.103.241.★
学习了,谢谢

  本站网友 时间:2009-03-11 16:46:10 IP地址:124.42.81.★
这个写的好

  本站网友 时间:2009-03-19 10:56:27 IP地址:58.209.81.★
顶起来

  本站网友 时间:2009-03-25 16:46:48 IP地址:222.90.231.★
鉴定结果:非常有用!

  本站网友 时间:2009-05-18 11:48:26 IP地址:202.117.115.★
的确不错,支持工作

  本站网友 时间:2009-05-18 16:10:40 IP地址:60.212.212.★
Google的第一个链接!
学习了,很详细。

  本站网友 时间:2009-06-09 09:29:18 IP地址:221.221.146.★
谢谢博主,学习了

  本站网友验证码 时间:2009-08-19 16:53:24 IP地址:58.213.167.★
本站网友验证码

  本站网友 时间:2009-08-20 11:05:17 IP地址:58.254.68.★

  本站网友 时间:2009-09-20 22:10:20 IP地址:222.178.75.★
写的好

  本站网友 时间:2009-11-13 09:29:45 IP地址:218.28.73.★
写的好

  本站网友 时间:2009-11-21 12:27:01 IP地址:123.103.67.★
写的好,谢谢啦~~

  本站网友 时间:2009-12-18 21:01:56 IP地址:221.11.17.★
谢谢分享了,不过,还是没有看明白


  发表评论



Copyright © 2001-2010 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.02149

京ICP证041476号