C++中 volatile
发布日期:2021-06-29 18:38:31
浏览次数:2
分类:技术文章
本文共 883 字,大约阅读时间需要 2 分钟。
文章目录
1.volatile的作用
- 这变量可能会被意想不到改变,
- 每次从内存中去读这个值,
- 而不是因编译器优化从缓存的地方读取,
- 比如读取缓存在寄存器中的数值,
- 从而保证volatile变量被正确的读取。
- 单任务中,函数体内部,如果在两次读取变量的值之间的语句没有对变量修改,编译器就对可执行代码优化。
- 访问寄存器的速度要快过RAM
- 以后只要变量的值没有改变,就一直从寄存器中读取变量的值,
- 而不对RAM访问。
- 多任务中,虽然在一个函数体内部,在两次读取变量之间没有对变量的值进行修改,但是该变量仍然有可能被其他的程序(如中断程序、另外的线程等)修改。
- 如下程序对这一现象进行了模拟。
#includeusing namespace std;int main(int argc,char* argv[]){ int i=10; int a=i; cout< <
-
TMD,输出10,10
-
以上代码须在Release模式下考查,只有Release模式下才对程序代码优化,
- 而这种优化在变量共享的环境下容易引发问题。
- 我通过查看汇编代码发现应该是 mov dword ptr [ebp-8],80
- b=i;之前,已通过内联汇编代码修改了i
- 但变化没反映到b,若i是一个被多个任务共享的变量,这种优化带来的错误是致命。
如何抑制编译器对读取变量的这种优化,来防止错误读取呢?
- 将i前申明为volatile即可
#includeusing namespace std;int main(int argc,char* argv[]){ volatile int i=10; int a=i; cout< <
- TMD,输出10,80
- 第二次读取变量i的值的时,已经获得了变化之后的值。
- 跟踪汇编代码可知,凡申明为volatile的变量,每次都是从内存中读取变量的值,而不是在某些情况下直接从寄存器中取值。
2.volatile应用场景
参考链接下次记得继续抄
转载地址:https://cyj666.blog.csdn.net/article/details/103244755 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年05月02日 14时18分34秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
1024. 视频拼接
2019-04-30
北漂码农的现状
2019-04-30
前端技巧必备:重置样式表reset.css
2019-04-30
css技巧--给选中的tab加下划线
2019-04-30
css技巧---位置中间的竖线|垂直居中
2019-04-30
css技巧---电子表体字体引入
2019-04-30
随笔---如何启动Redis
2019-04-30
css技巧---menu菜单加new
2019-04-30
uni-app 开发技巧:复选框list选择后value传多值问题
2019-04-30
ES6数组中删除指定元素
2019-04-30
freemarker模板当标签内的元素为空报错解决方案
2019-04-30
序列化对象
2019-04-30
理解对象意思
2019-04-30
百度地图路书开发---增加路书销毁
2019-04-30
echarts日历自定义月份
2019-04-30
如何解决中文乱码问题
2019-04-30
关于如何彻底卸载SQL SERVER2005 2008
2019-04-30