C语言中的volatile关键字

其实我自己写程序就没有碰到过volatile的问题,但是人家也是一个关键字,肯定有它存在的意义。再说我也没干过嵌入式低层多线程的工作,没碰到也是正常的。也有可能我水平太low,哈哈。

 volatile是告诉编译器对它所修饰的对象别执行优化。volatile在进行多线程编程时要注意,而在在单线程中那就是只能起到限制编译器优化的作用。 如果一个变量被volatile修饰,编译器将不会把它保存到寄存器中,而是每一次都去访问内存中实际保存该变量的位置上的值。这样就避免了没有volatile修饰的变量在多线程的读写中所产生的由于编译器优化所导致的问题。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。例如下面:

volatile int flag = 1;
while(flag)
{
   ...
}

while的条件就不会被编译器当作无条件真。而是每次都去内存中看一下这个flag的值是不是为真。有哥们总结了volatile的作用,我照着理解写一下了。


 1 不会在两个操作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,volatile就是告诉编译器这种情况。
 2 不做常量合并、常量传播等优化。
 3 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值操作,然而对Memory Mapped IO的处理是不能这样优化的。

基本上就是这样,没说到点子上的话,主要原因在于我没有这个方面的使用体会。


有一个常见的问题:const volatile int i=10这行代码有没有问题?如果没有,那到底i是什么属性。

答:“volatile”的含义是“请不要做没谱的优化,这个值可能变掉的”,而“const”含义是“请做为常量使用”,那么它们本来就不是矛盾的。那么什么情景下会这样用嘞?可以这么试着理解:如果一个变量不会被本程序改变,通常可能给它加上const,但如果该变量可能被其他程序改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量就同时有volatile和const了。


Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计,皆可应用在项目、毕业设计、课程设计、期末/期/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值