用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