volatile关键字学习

来源:互联网 发布:mac 3d建模软件 编辑:程序博客网 时间:2024/04/28 07:08

用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