九月鹰飞

慎独自修,忠恕宽容,至诚尽性。

  VC知识库BLOG :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  19 随笔 :: 13 文章 :: 298 评论 :: 5 Trackbacks
<2004年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

相册

搜索

最新评论

阅读排行榜

评论排行榜

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文件,输入下面的代码:

#include <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关键字,看看有什么变化:


#include <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

这说明这个关键字发挥了它的作用!

iwaswzq 于2004/12/4/16:15

 

posted on 2004-12-05 05:33 九月鹰飞 阅读(31314) 评论(121)  编辑 收藏

评论

# re: 关于volatile关键字的说明以及测试 2004-12-06 13:09 一笑
不错!我正欠缺这方面的知识,本文解了我不少困惑,哈哈。另外,MSDN把volatile称为keyword,我认为不妥。我觉得volatile和const应该被称为限定符(the c programming language)或者描述符(the c++ programming language)更为合适。否则,本文中两处声明(定义)就有点不好解释了。
int volatile nVint;
volatile int i=10;

希望iwaswzq老大谈谈volatile在实际开发中的具体应用,比如具体用在那些环境下,举几个实际的例子,让我们也有些感性的认识。面试中考volatile是很多的:p

# re: 关于volatile关键字的说明以及测试 2004-12-07 00:09 freedk
笑笑说的对,支持以后多出这方面的文章:P

# re: 关于volatile关键字的说明以及测试 2004-12-30 20:49 doudou
iwaswzq 于2004/12/4/16:15万岁,讲的真是透彻




# 补充一篇csdn里面关于这个修饰符的讨论,有所借鉴 2005-02-26 16:57 iwaswzq
CSDN - 专家门诊 - C/C++ C语言问题  
  
主  题:  请教:有关volatile (函数前加volatile) 和inline的用法. 
作  者:  chinavistor (china)  
发表时间:  2005-02-25 13:47:41 
   
volatile修饰函数,作用是什么呢?
如 volatile void fun1(int i);

 回复:
--------------------------------------
winstonch 
? volatile 能修饰函数吗?

--------------------------------------
kobefly(科比---不惧挑战!)

volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

static int i=0;

int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}

/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。

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

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

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

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

-------------------------------------- 
happy__888([顾问团]寻开心)  

volatile表示变量的内容可能在程序未知的情况下被改变
比如,它对应的内存地址的内容被中断函数,或者其他的进程所改变
这种类型的变量,程序执行的时候不会放到cache当中预取,而是每次用到的时候直接取得
比如,你在c中间写这样的程序
for (int i=0; i<100000;i++); 
空循环,什么也不做
这个东西就会被优化调,如果在int前面加入这个标记则不会被优化的,因为i每次的变化不一定++也虚在循环中间被别的程序所改变

--------------------------------------
chinavistor(china)

volatile修饰变量我能理解,但修饰函数我就不清楚

在linux的source code(linux/mm/memory.c)中有这样两句:
volatile void do_exit(long code);

static inline volatile void oom(void)
{
printk("out of memory\n\r");
do_exit(SIGSEGV);

 

-------------------------------------- 
gaoxiaolin_311(随风而去)

 volatile修饰函数是为了线程安全的考虑。 
 
-------------------------------------- 
happy__888([顾问团]寻开心) 
 
volatile 函数 是特指存在于volatile memory当中的函数吧,函数指针也是随时会变化的 
 
 http://www.csdn.com.cn/program/6552.htm 
 
 http://merced.allaboutprogram.com/Trans/Andrei/GenericProgramming%20volatile.doc 



# re: 关于volatile关键字的说明以及测试 2005-09-24 20:46 ggg
32个关键怎么读啊,起什么用啊

# re: 关于volatile关键字的说明以及测试 2005-09-24 20:48 吴军
32个关键怎么读啊,起什么用啊,有的用字典都查不到的啊, 我学了这么都不知道是什么意思啊,有高手在请帮忙谢谢!!


# re: 关于volatile关键字的说明以及测试 2005-10-31 09:39 drift
好,说得清楚、明白

# 关于volatile关键字的说明以及测试 [TrackBack] 2006-03-27 14:00 toplin8
关于volatile关键字的说明以及测试
toplin8引用了该文章,地址:http://blog.csdn.net/toplin8/archive/2006/03/27/640070.aspx

# volatile关键字[TrackBack] 2006-12-12 10:29 xuytf
关于volatile关键字的说明以及测试
xuytf引用了该文章,地址:http://blog.csdn.net/xuytf/archive/2006/12/12/1439459.aspx

# volatile的用法。。[TrackBack] 2007-04-04 20:52 thimin
volatile的用法,,,,,,,,,
thimin引用了该文章,地址:http://blog.csdn.net/thimin/archive/2007/04/04/1552135.aspx

# re: 关于volatile关键字的说明以及测试 2007-09-04 05:58 kuresel ısınmaya hayır
static inline volatile void oom(void) 
{ printk("out of memory\n\r"); do_exit(SIGSEGV); 



# re: 关于volatile关键字的说明以及测试 2007-09-04 05:58 kral oyun
thanks

# re: 关于volatile关键字的说明以及测试 2007-09-30 06:06 saddsa@sjsjs.com
thanks

# re: 关于volatile关键字的说明以及测试 cep telfonu 2007-09-30 06:07 saddsa@sjsjs.com
thanks

# re: 关于volatile关键字的说明以及测试 2007-09-30 06:07 cep telefonu
thanks

# re: 关于volatile关键字的说明以及测试 2007-12-10 02:22 vB-Hacker.com daki seo
thanks

# re: 关于volatile关键字的说明以及测试 2007-12-15 15:47 CharlesXu
Thanks!

# re: 关于volatile关键字的说明以及测试 2008-05-25 21:51 TT
不错,简洁明了

# re: 关于volatile关键字的说明以及测试 2008-06-11 23:28 king
不错 讲得比《c++编程思想》volatile变量那节要好


# seo yarışması 2008-07-11 05:51 infoq@r10net.com
Ty bro

# seo yarışması 2008-07-11 05:51 seo yarışması
Tyyyy

# re: 关于volatile关键字的说明以及测试 2008-08-04 18:50 halı yıkama
thanks

# re: 关于volatile关键字的说明以及测试 2008-08-31 04:45 Oyun Oyna
thank you 

# re: 关于volatile关键字的说明以及测试 2008-09-21 20:08 www.indir-forum.com
brawo

# re: 关于volatile关键字的说明以及测试 2008-09-21 20:10 Ücretsiz Ödüllü Bilgi Yarışmas
Ücretsiz Ödüllü Bilgi Yarışması Zorquiz.com da Bedava  Ödüllü Bilgi Yarışmasında bilen kazanıyor.


# re: 关于volatile关键字的说明以及测试 2008-11-04 21:37 güney servis
thanks very good

# re: 关于volatile关键字的说明以及测试 2008-12-17 23:17 Hayvan Resimleri
thank u

# sohbet 2008-12-18 08:43 sohbet
thank you nice sharing nice site 

# re: 关于volatile关键字的说明以及测试 2009-01-21 03:25 sohbet odaları
thanks

# re: 关于volatile关键字的说明以及测试 2009-01-21 03:26 sohbet
thanks

# re: 关于volatile关键字的说明以及测试 2009-01-21 03:26 chat
thanks

# re: 关于volatile关键字的说明以及测试 2009-01-21 03:27 aşk şiirleri
yest:)

# re: 关于volatile关键字的说明以及测试 2009-01-21 03:27 güzel sözler
thnaks

# re: 关于volatile关键字的说明以及测试 2009-01-24 18:20 cam balkon
thanks 

# re: 关于volatile关键字的说明以及测试 2009-02-13 00:03 Araba Oyunları
Brawo katılıyorum :P

# re: 关于volatile关键字的说明以及测试 2009-02-28 02:00 oyun oyna
ehh bende katılım bari katula katula 

# re: 关于volatile关键字的说明以及测试 2009-02-28 02:00 araba oyunları
thanks

# re: 关于volatile关键字的说明以及测试 2009-03-06 04:55 sohbet odaları
Thanks so much for this! This is exactly what I was looking for

# re: 关于volatile关键字的说明以及测试 2009-03-09 16:14 halı yıkama makinası
thank

# re: 关于volatile关键字的说明以及测试 2009-03-09 16:15 deniz iskelesi
very site

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:27 netlog
verr good

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:27 netlog
verr good

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:27 sohbet siteleri
hello

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:27 sohbet siteleri
hello admin

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:28 turkchat
hello co admin

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:28 turkchat
hello

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:28 çet
hello

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:29 sohbet odaları
hello

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:29 sohbet kanalları
hello

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:29 chat siteleri
hello

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:30 chat kanaları
hello

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:30 chat
chat

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:30 sevgi sozlerı
hello

# re: 关于volatile关键字的说明以及测试 2009-03-12 14:30 guzel sozler
hello

# re: 关于volatile关键字的说明以及测试 2009-03-13 21:44 halı yıkama
interesting :)

# re: 关于volatile关键字的说明以及测试 2009-03-28 06:05 cet
thanks...

# re: 关于volatile关键字的说明以及测试 2009-03-28 06:10 cet
thanks..

# re: 关于volatile关键字的说明以及测试 2009-03-28 06:12 cet
thanks..

# halı yıkama 2009-04-29 10:47 kuzeycem@gmail.com
Thanks  


<a href="http://www.kuzeyhaliyikama.com" target="_blank">halı yıkama</a>

# halı yıkama 2009-04-29 10:49 www.kuzeyhaliyikama.com
http://www.kuzeyhaliyikama.com


sory

# halı yıkama 2009-04-29 10:50 kuzeyhali@gmail.com
I am turkey

# re: 关于volatile关键字的说明以及测试 2009-06-14 15:26 mrak
thanks <a href="http://www.oyunjet.net" title="oyunlar, kral oyun" target="_blank">oyUn</a>

# re: 关于volatile关键字的说明以及测试 2009-06-14 15:26 oyUn
great thans

# mynak 2009-07-31 04:47 mynak
asd

# re: 关于volatile关键字的说明以及测试 2009-08-19 05:36 halı yıkama
Thanks

# sohbet odalari 2009-08-21 00:00 http://www.asgum.net
<a href="http://www.asgum.net"">http://www.asgum.net" title="kizlarla sohbet, bayanlarla sohbet" target="_blank">kizlarla sohbet</a>
<a href="http://www.asgum.net"">http://www.asgum.net" title="msn sohbet, bayanlarla sohbet" target="_blank">msn sohbet</a>
<a href="http://www.aksaraysohbet.com"">http://www.aksaraysohbet.com" title="aksaray, aksaray resimleri" target="_blank">aksaray</a>
<a href="http://www.aksaraysohbet.com"">http://www.aksaraysohbet.com" title="aksaray 68 , aksaray haberleri" target="_blank">aksaray 68</a>
<a href="http://www.jetsohbet.net" title="sohbet odaları, bedava sohbet" target="_blank">Sohbet Odaları</a>


# re: 关于volatile关键字的说明以及测试 2009-09-03 01:26 netlog
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:29 aşk şiirleri
thanks you

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:30 aşkyeri
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:30 turkchat
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:30 almanya chat
thankssss

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:31 çet
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:31 cet
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:31 camfrog
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:31 chat siteleri
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:32 sohbet siteleri
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:32 aşk sözleri
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:32 şiir
thnks

# re: 关于volatile关键字的说明以及测试 2009-09-03 01:32 aşk
thanks

# re: 关于volatile关键字的说明以及测试 2009-09-27 19:11 sesli chat
Thank you for your sharing.!

# re: 关于volatile关键字的说明以及测试 2009-11-23 21:09 oyunlar
technologies that have created a paradigm shift in the software industry – I was born just after the spinning magnetic hard drive was created. Off the top of my head I can think of: the Internet (thanks Al!), optical disks, Windows, and parallel computing. From each of these technologies entirely new software 

# re: 关于volatile关键字的说明以及测试 2010-01-16 17:10 halı yıkama
halı yıkama şirketi

# re: 关于volatile关键字的说明以及测试 2010-01-18 17:08 halı yıkama
technologies that have created a paradigm shift in the software industry – I was born just after the spinning magnetic hard drive was created. Off the top of my head I can think of: the Internet (thanks Al!), optical disks, Windows, and parallel computing. From each of these technologies entirely new software  


# re: 关于volatile关键字的说明以及测试 2010-01-25 06:25 ileamkeila@hotmail.com
thanks you

# re: 关于volatile关键字的说明以及测试 2010-01-25 06:26 http://www.travestiilan.com
thanks you

# re: 关于volatile关键字的说明以及测试 2010-01-25 06:27 iddaa
thankss

# re: 关于volatile关键字的说明以及测试 2010-01-25 06:27 sikiş
thanks

# re: 关于volatile关键字的说明以及测试 2010-01-25 06:28 sex
thanks you.. 

# re: 关于volatile关键字的说明以及测试 2010-01-25 06:28 porno
very good

# re: 关于volatile关键字的说明以及测试 2010-01-25 06:29 sikiş
thanks

# re: 关于volatile关键字的说明以及测试 2010-01-25 06:29 travesti
thankss

# re: 关于volatile关键字的说明以及测试 2010-01-27 14:58 Chicago Speed Dating
Chicago speed dating is the fun new way to meet singles from Chicago. We liked the site, and that is why we have taken the time to introduce Chicago First Dates.

# re: 关于volatile关键字的说明以及测试 2010-02-09 03:53 oyun oyna
thanks you 


# re: 关于volatile关键字的说明以及测试 2010-02-10 03:50 online oyun
echnologies that have created a paradigm shift in the software industry – I was born just after the spinning magnetic hard drive was created. Off the top of my head I can think of: the Internet (thanks Al!), optical disks, Windows, and parallel computing. From each of these technologies entirely new software   


# porno 2010-02-10 11:37 porno
canlı vıdeolar burada.

# erotik 2010-02-10 11:38 porno izle
erotık tv ızle

# sıcak video 2010-02-10 11:40 sex
sexy klipler seyretmesene

# trerotık 2010-02-10 11:40 erotik video
erotık vıdeuo

# canlıızleme 2010-02-10 11:41 porno
canlı ızleme

# porno 2010-02-10 11:42 porno
sikiş mıkıs yok

# porno 2010-02-10 11:42 porno
porn vıdeos

# sözluk 2010-02-10 11:43 sözlük
ideal sozluk

# amerikan door 2010-02-10 11:45 amerikan kapı
amerikan kapılar

# re: 关于volatile关键字的说明以及测试 2010-02-13 20:24 Keyifli Sohbet
<a href="http://www.keyiflisohbet.org" title="Kızlarla Sohbet, Sohbet odaları, Bayanlarla Sohbet" target="_blank">Sohbet Odaları</a>

# re: 关于volatile关键字的说明以及测试 2010-02-13 20:24 Sohbet Sitesi
<a href="http://www.keyiflisohbet.org" title="Sohbet Sitesi" target="_blank">Sohbet Sitesi</a>

# sex shop 2010-02-22 23:16 sex shop
seks shop

# zayıflama hapı 2010-02-22 23:17 zayıflama hapı
zayıflama hapı

# red pepper 2010-02-22 23:18 red pepper
red pepper hapı

# penis büyütücü 2010-02-22 23:19 penis büyütücü
penis büyütücü

# seks shop 2010-02-22 23:19 seks shop
seks shop

# geciktirici sprey 2010-02-22 23:20 geciktirici sprey
geciktirici sprey

# oyun oyna 2010-02-24 20:39 oyun oyna
Thank you for great article.

# oyun oyna 2010-02-24 20:40 oyun oyna
funny thx

# oyun oyna 2010-02-24 20:41 oyun oyna
great write..

# oyun oyna 2010-02-24 20:42 oyun oyna
thank you nice sharing

# girl games 2010-02-24 20:42 girl games
Thanks so much for this!

# film indir 2010-02-24 20:43 film indir
Thanks.

# şarkı sözleri 2010-02-24 20:43 şarkı sözleri
This great

# re: 关于volatile关键字的说明以及测试 2010-02-26 00:44 the office season 6 episode 16
thank you nice sharing 

# re: 关于volatile关键字的说明以及测试 2010-03-05 19:31 legrand
thank you very much

# halı yıkama 2010-03-05 19:31 halı yıkama
thank you very much

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]