当前位置: 首页 > news >正文

关于volatile

也许读者会注意到,端口寄存器的变量使用了volatile 修饰符,这是因为C语言在编译的时候会进行某种优化来提高效率,比如下面这段代码
int i = 1;
int a = i;
int b = i;
对于编译器来说,处理a=i 的时候,是先把i的内容放入寄存器中,然后把寄存器的内容付值给a, 当处理b = i的时候,编译器发现在这中间并没有其它代码,也就是认为i的内容不会发生变化,因此不需要再一次从i中读取内容,而是直接把刚才放入寄存器里的内容再付值给b, 这对一般的程序是没有任何问题的,而且提高了效率。但是存在一些编译器不知道的原因,让i 的值产生了变化,那么就在b=i的时候,b得到值并不是i真正的内容。对于端口的地址来说,其内容是有可能被改变,而编译器无法知道的这个改变,因此,我们通过volatile 修饰符告知编译器,i的内容,可能会随时变化,不要对i的操作进行优化,读取操作不要通过中间的寄存器读取,必须每次都去i的地址去取值。这就保证了可以正确的取到i的内容了。

 

相关文章:

  • 通过vbs脚本备份数据-本地到异地
  • 动态SQL和静态SQL
  • hadoop集群监控工具ambari安装
  • MVC 区分是哪按键提交FORM
  • UML画图总结以及浅谈UNL九种图
  • LAMP+extmail+postfix+dovecot
  • 修复被破坏了的linux文件系统分区表
  • poj2488 A Knight's Journey 简单DFS 注意搜索步骤
  • ProgressBar
  • linux 学习(三) php相关
  • 欧拉计划的Python解法(1-10)
  • SharePoint 网站登录不上,3次输入用户名/密码白页、
  • 关于C语言指针几个容易混淆的概念
  • 八一八android开发规范(一种建议)
  • 产品经理:想爱没那么简单
  • hexo+github搭建个人博客
  • django开发-定时任务的使用
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Java编程基础24——递归练习
  • JS数组方法汇总
  • js正则,这点儿就够用了
  • JS字符串转数字方法总结
  • linux安装openssl、swoole等扩展的具体步骤
  • Otto开发初探——微服务依赖管理新利器
  • 阿里云购买磁盘后挂载
  • 创建一个Struts2项目maven 方式
  • - 概述 - 《设计模式(极简c++版)》
  • 简单实现一个textarea自适应高度
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 嵌入式文件系统
  • 人脸识别最新开发经验demo
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ionic异常记录
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #{}和${}的区别是什么 -- java面试
  • (1)(1.13) SiK无线电高级配置(六)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (黑马C++)L06 重载与继承
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *** 2003
  • ****Linux下Mysql的安装和配置
  • . NET自动找可写目录
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET BackgroundWorker
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 表达式计算:Expression Evaluator
  • .net 获取url的方法
  • /3GB和/USERVA开关
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [2010-8-30]
  • [20150707]外部表与rowid.txt