首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

volatile的用法(2)

volatile的用法(2)

首先,用classwizard建一个win32console工程,插入一个voltest.cpp文件,输入下面的代码:


1   
2
3
4
5
6
7
8
9
10
11
12
13
14
#include
void main(int argc, char* argv[] )
{
    inti = 10;
    inta = i;
    printf("i= %d", a);
    //下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
    __asm
    {
        movdword ptr [ebp-4], 20h
    }
    intb = i;
    printf("i= %d", b);
}




然后,在调试版本模式运行程序,输出结果如下:
i = 10
i = 32
然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10
输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。下面,我们把i的声明加上volatile关键字,看看有什么变化:


1   
2
3
4
5
6
7
8
9
10
11
12
13
#include
void main(int argc, char* argv[] )
{
    volatileint i=10;
    inta = i;
    printf("i= %d", a);
    __asm
    {
        movdword ptr [ebp-4], 20h
    }
    intb = i;
    printf("i= %d", b);
}




分别在调试版本和release版本运行程序,输出都是:
i = 10
i = 32
这说明这个关键字发挥了它的作用!
------------------------------------
volatile对应的变量可能在你的程序本身不知道的情况下发生改变
比如多线程的程序,共同访问的内存当中,多个程序都可以操纵这个变量
你自己的程序,是无法判定何时这个变量会发生变化
还比如,他和一个外部设备的某个状态对应,当外部设备发生操作的时候,通过驱动程序和中断事件,系统改变了这个变量的数值,而你的程序并不知道。
对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。
--------------------------------------------------------------------------------
典型的例子


1
   for ( int i=0;i<100000; i++ );




这个语句用来测试空循环的速度的
但是编译器肯定要把它优化掉,根本就不执行
如果你写成


1   
for (volatile int i=0;i<100000; i++ );




它就会执行了
volatile的本意是“易变的”
继承事业,薪火相传
返回列表