volatile关键字学习

用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  

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的volatile关键字是用来声明一个变量为“易变”的。这意味着该变量的值可以在程序执行期间随时发生变化,可能由于硬件或者其他并行执行的线程的影响。使用volatile关键字可以告诉编译器不要对该变量进行优化,以确保每次访问该变量时都从内存中读取最新的值。这对于需要频繁读写硬件寄存器或者在多线程环境下共享的变量非常有用。 参考资料: C语言深度解析专栏—C语言关键字详解第五篇 C语言再学习 -- 关键字volatile_聚优致成的博客-CSDN博客 更多关键字在下面博客链接 C语言关键字详解(一)auto、register关键字 C语言关键字详解(二)带你全面了解 static C语言关键字详解(三)数据类型与sizeof关键字 C语言关键字详解(四)带你全面了解 const 关键字<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C语言关键字详解(五)带你全面了解 volatile 关键字](https://blog.csdn.net/m0_62391199/article/details/123746218)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C语言volatile 关键字](https://blog.csdn.net/qq_58264156/article/details/127416196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值