<b>volatile关键字的阐明以及测试</b>[VC/C++编程]
本文“<b>volatile关键字的阐明以及测试</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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
",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关键字,看看有什么改变:
#include <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
这阐明这个关键字施展了它的作用!
以上是“<b>volatile关键字的阐明以及测试</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |