为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我们使用volatile关键字?

为什么我们使用volatile关键字?

C++
斯蒂芬大帝 2019-11-21 10:41:42
我从未使用过它,但我想知道为什么人们会使用它?它到底是做什么的?我搜索了该论坛,发现只有C#或Java主题。
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

考虑一下这段代码,


int some_int = 100;


while(some_int == 100)

{

   //your code

}

当此程序被编译,编译器优化的代码,如果它认为,该方案从来没有能做出任何试图改变的价值some_int,所以它可能会倾向于优化while通过更改其循环while(some_int == 100)到的东西,相当于while(true)使执行可能很快(因为while循环中的条件似乎true总是存在)。(如果编译器未对其进行优化,则它必须some_int在每次迭代中获取的值并将其与100进行比较,这显然有点慢。)


但是,有时(对程序的某些部分)进行优化可能是不可取的,因为可能是其他人正在some_int从编译器不知道的程序外部更改它的值,因为它看不到它。但这就是您设计的方式。在这种情况下,编译器的优化将无法产生预期的结果!


因此,为了确保获得理想的结果,您需要以某种方式停止编译器优化while循环。这就是volatile关键字发挥作用的地方。您需要做的就是这个,


volatile int some_int = 100; //note the 'volatile' qualifier now!

换句话说,我将对此解释如下:


volatile 告诉编译器,


“嘿,编译器,我易变,而且,您甚至可以通过一些您甚至不知道的XYZ来更改我。XYZ可以是任何东西。也许是这个星球之外的某个外星人,称为程序。也许是一些照明,某种形式中断,火山等都可能使我突变。也许你永远都不知道谁会改变我!所以,你一无所知,不要再扮演一个全知的神,也不敢触摸我现在所在的代码。 ?


好吧,这就是volatile防止编译器优化代码的方式。现在在网上搜索以查看一些示例示例。


从C ++标准报价($ 7.1.5.1 / 8)


[..] volatile是实现避免使用对象的积极优化的暗示, 因为对象的值可能会通过实现无法检测到的方式进行更改。[...]


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 447 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号