Kisser Leon

这个kisser不太冷
posts - 100, comments - 102, trackbacks - 0, articles - 0

c++ volatile关键字

Posted on 2010-04-01 10:54 kk 阅读(2567) 评论(7)  编辑 收藏 引用 所属分类: C++
c++中的volatile关键字一直没有使用过。最近使用了一下。该关键字的意思就是告诉编译器不要对该变量进行优化,使用地址对该变量进行取值而不要直接使用该变量已经存在cach/寄存器中的值。

测试代码如下:
 1// volatile.cpp : Defines the entry point for the console application.
 2//
 3
 4#include "stdafx.h"
 5
 6
 7int _tmain(int argc, _TCHAR* argv[])
 8{
 9    //volatile int a = 1;
10    int a = 1;
11    printf ("a = %d\n", a);
12
13    __asm
14    {
15        mov DWORD ptr [ebp-4], 10h // 修改a的值为0x10
16    }

17
18    printf ("a = %d\n", a);
19
20    getchar();
21
22    return 0;
23}

24
25

如果编译器没有优化的话,打印出来的值应该是1和16。反之,如果没有使用volatile,优化之后应该打印出来的是1和1

我在vc6和vc2008下测试了一下:
-----------------------------------------------------------------------------------------

vc2008
-----------------------------------------------------------------------------------------
没有关键字volatile
debug下打印的是 1 和 1 ---为什么会被优化了呢?我的优化编译选项是disabled的
release下打印的是 1 和 1
有关键字volatile
debug下打印的是 1 和 1 --- 很奇怪!
release下打印的是 1 和 16

我想可能是编译器对debug下作了特殊处理。而且该程序非常简单


vc6.0
-----------------------------------------------------------------------------------------
没有关键字volatile
debug下打印的是 1 和 16
release下打印的是 1 和 1

有关键字volatile
debug下打印的是 1 和 16
release下打印的是 1 和 1 --- 很奇怪!


小结:
在多线程多核的情况下,要防止被编译器优化!

Feedback

# re: c++ volatile关键字  回复  更多评论   

2010-04-01 12:18 by 过客
谁懂的来解释下啊

# re: c++ volatile关键字[未登录]  回复  更多评论   

2010-04-01 14:20 by Jerry
mov DWORD ptr [ebp-4], 10h // 修改a的值为0x10

a地址有错误

# re: c++ volatile关键字  回复  更多评论   

2010-04-02 19:03 by 飞鸽传书
几乎不要用的这个功能。

# re: c++ volatile关键字  回复  更多评论   

2010-04-06 11:07 by Lo
应该用

__asm
{
lea eax, a
mov dword ptr [eax], 0x10
}

要不然 debug 出错的机率太高了

# re: c++ volatile关键字[未登录]  回复  更多评论   

2010-04-08 16:25 by
to Lo

谢谢!
通过lea获取的地址肯定是对的。用你的办法在2008下试了一下,没有volatile输出都是1和16,也就是说编译器没有优化----可能是例子太简单了

使用了volatile,也都是1和16----这个是必须要保证的

# re: c++ volatile关键字  回复  更多评论   

2010-05-22 16:15 by
你那样取到的a的地址不对

微软在栈中可能还放了其他的临时变量

推荐这个


__asm
{
lea eax, a
mov dword ptr [eax], 0x10
}

# re: c++ volatile关键字  回复  更多评论   

2012-04-18 11:49 by fans
愚蠢总有愚蠢的解释。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理