您的位置:首页 > 其它

volatile关键字学习

2011-04-28 23:38 225 查看
用volatile关键字修饰变量时,会告诉编译器不要进行优化,将变量的值缓存在寄存器里,

而是每次使用时都要从变量存储位置重新读取,这可以防止该变量在未知的地方和时候可能被改变。

这对于多线程共享的变量等很重要。

看下面的例子:

int main()

{

int i = 10; //未加关键字volatile

int a = i;

printf("i = %d", a);

__asm{

mov dword ptr[ebp - 4], 20h

}

int b = i;

printf("i = %d", b);

return 0;

}

结果a = 10,b = 10

汇编代码:

00401000 push esi

00401001 mov esi,dword ptr [__imp__printf (4020A0h)]

00401007 push 0Ah

00401009 push offset string "i = %d" (4020F4h)

0040100E call esi

00401010 add esp,8

00401013 mov dword ptr [ebp-4],20h

0040101A push 0Ah

0040101C push offset string "i = %d" (4020F4h)

00401021 call esi

00401023 add esp,8

00401026 xor eax,eax

00401028 pop esi

00401029 ret

int main()

{

volatile int i = 10; //加关键字volatile

int a = i;

printf("i = %d", a);

__asm{

mov dword ptr[ebp - 4], 20h

}

int b = i;

printf("i = %d", b);

return 0;

}

结果a = 10,b = 32

汇编代码:

00401000 push ebp

00401001 mov ebp,esp

00401003 push ecx

00401004 push esi

00401005 mov esi,dword ptr [__imp__printf (4020A0h)]

0040100B mov dword ptr [i],0Ah

00401012 mov eax,dword ptr [i]

00401015 push eax

00401016 push offset string "i = %d" (4020F4h)

0040101B call esi

0040101D add esp,8

00401020 mov dword ptr [i],20h

00401027 mov eax,dword ptr [i]

0040102A push eax

0040102B push offset string "i = %d" (4020F4h)

00401030 call esi

00401032 add esp,8

00401035 xor eax,eax

00401037 pop esi

00401038 mov esp,ebp

0040103A pop ebp

0040103B ret
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: