volatile

文章讲述了volatile关键字的作用,它用于标记易变变量,防止编译器优化导致的值不准确。在多线程和中断函数下,volatile确保了数据的实时性。编译器优化是为了提高性能,但volatile阻止了这种优化,以保证数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

volatile 意思是 易变的,用来修饰某个变量,如 volatile int flag = 0; 告诉编译器这是一个容易被改变的量,每次用的都要到源内存地址去读取,请不要随便优化,不要读缓存,避免优化后读取到的值不是实时的准确值。

如 int flag = 0;int a = flag, int b = flag; 在对a和b赋值的过程中,编译器从这段代码看到并没有对flag重新赋值的地方,所以会用赋值给a的flag直接赋值给b,但是多线程情况下,flag可能在其他线程被修改了,所以赋值给b的时候可能是一个不准确的值。还有就是flag如果是通过中断函数修改,或者通过汇编代码修改了,从编译器角度也看不出来,所以编译器的优化会导致拿到不准确的值。

编译为什么会做这个优化呢?因为从编译器的角度就是要想办法让程序运行时能提高性能,对读取过的值放到寄存器或者高速缓存上下次再去读,相对于每次都去内存中读,效率就会提升很多。可以对比这两句代码执行的时间看出有volatile和没有volatile的效果。

for(int i=0; i<1000000000; i++);// 编译器优化

for(volatile int i=0; i<1000000000; i++);// 编译器不优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangcpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值