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
而是每次使用时都要从变量存储位置重新读取,这可以防止该变量在未知的地方和时候可能被改变。
这对于多线程共享的变量等很重要。
看下面的例子:
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
相关文章推荐
- 我的小小学习笔记(2)之C语言——浅谈关键字 const,static,volatile(1)
- 《多线程编程》学习之六:String的常量池特性,锁对象的改变,volatile关键字
- C#中的关键字学习:delegate(委托)和volatile
- java中volatile关键字---学习笔记
- 重新学习一下Java中的几个关键字(final/static/volatile......)
- C 语言中Volatile关键字学习
- C#关键字学习_1,as,yield,virtual,volatile,params ,ref和out
- c语言关键字学习之 static register inline volatile
- volatile关键字 学习记录2
- C语言中volatile关键字的学习
- Java并发编程学习笔记 深入理解volatile关键字的作用
- 深入学习volatile关键字
- [C++学习01]强制类型转换和volatile关键字
- 通过学习volatile关键字了解java内存数据访问
- Java多线程-通过线程的中断来深入学习interrupt方法,Volatile关键字
- 一个具体的例子学习Java volatile关键字
- JAVA多线程技术学习笔记——volatile关键字解析
- 【C++学习】mutable关键字、volatile关键字
- C#学习基本概念之关键字--volatile(不稳定)
- java基础学习总结——volatile关键字解析