当前位置:w88手机版登录-www.w88zhan.com-优德w88app官方登录 > w88手机版登录网络 > 用volatile关键字声明的变量i每一次被访问时

用volatile关键字声明的变量i每一次被访问时

文章作者:w88手机版登录网络 上传时间:2019-11-14

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 ",a);
 //下边汇编语句的效劳便是改变内部存款和储蓄器中i的值,然则又不让编写翻译器知道
 __asm {
  mov dword ptr [ebp-4], 20h
 }
 
 int b = i;
 printf("i= %d ",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 ",a);
 __asm {
  mov dword ptr [ebp-4], 20h
 }
 
 int b = i;
 printf("i= %d ",b);
}     
独家在调节和测量试验版本和release版本运路程序,输出都以:
i = 10
i = 32
那注明这几个关键字表明了它的效能!

 

用volatile关键字注脚的变量i每叁次被访谈时...

本文由w88手机版登录-www.w88zhan.com-优德w88app官方登录发布于w88手机版登录网络,转载请注明出处:用volatile关键字声明的变量i每一次被访问时

关键词: