登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

这篇帖子只是让你搞懂“volatile”

[复制链接]
发表于 2017-2-11 21:33:51 | 显示全部楼层 |阅读模式
本帖最后由 倔强的晓旭牛 于 2017-2-11 21:39 编辑

volatile 主要影响编译器的结果,指出volatile变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免发生错误。(VC++在产生release版可执行代码时,会进行编译优化,加volatile关键字变量的有关运算,将不进行编译优化)
例如:

volatile 告诉编译器 i 是随时间可能发生变化的,每次使用它的时候必须从 i 的地址中读取,因而编译器生成的可执行代码会重新从 i 的地址读取数据放在 k 中。而优化做法是,由于编译器发现两次从 i  读取的数据之间的代码没有对 i 进行过操作,它会自动把上次读的数据放在 k 中,而不是重新从 i 里面读。这样以来,如果 i 是一个寄存器变量或者表示一个端口数据就容易出错,所以说 volatile 可以保证对特殊地址的稳定访问,不会出错。
volatile 变量的几个例子:
(1)并行设备的硬件寄存器(如:状态寄存器);
(2)一个中断服务子程序中会访问到的非自动变量;
(3)多线程应用中被几个任务共享的变量;
归结:
1、告诉 compiler 不能做任何优化
比如要往某一地址送两指令

以上程序 compiler 可能做优化而成:

结果第一个指令丢失。如果用 volatile 就不允许做任何的优化,从而保证程序的原意:

即使你要 compiler 做优化,它也不会要两次赋值语句化为一次,它只能做其他方面的优化。
2、表示用 volatile 定义的变量会在程序外被改变,每次都必须从内存中读取,而你能把它放在 cache 或寄存器中重复使用。
如:

如果没有 volatile ,doother()不会执行。
《完》

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
宁愿跑起来被拌倒无数次,也不要规规矩矩走一辈子...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表