一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值(From Memory),而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:

1) 并行设备的硬件寄存器(如:状态寄存器)

2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3) 多线程应用中被几个任务共享的变量

这个多用在嵌入式开发中,一般场合不需要使用。

先看看下面的例子:
int i=10;
int j = i;//(1)语句
int k = i;//(2)语句
这时候编译器对代码进行优化,因为在(1)、(2)两条语句中,i 没有被用作左值。这时候编译器认为i 的值没有发生改变,所以在(1)语句时从内存中取出i 的值赋给j 之后,这个值并没有被丢掉,而是在(2)语句时继续用这个值给k 赋值。编译器不会生成出汇编代码重新从内存里取i 的值,这样提高了效率。但要注意:(1)、(2)语句之间i 没有被用作左值才行。

再看另一个例子:
volatile int i=10;
int j = i;//(3)语句
int k = i;//(4)语句
volatile 关键字告诉编译器i 是随时可能发生变化的,每次使用它的时候必须从内存中取出i的值,因而编译器生成的汇编代码会重新从i 的地址处读取数据放在k 中。这样看来,如果i 是一个寄存器变量或者表示一个端口数据或者是多个线程的共享数据,就容易出错,所以说volatile 可以保证对特殊地址的稳定访问。

C语言修饰词之violate相关推荐

  1. C语言修饰词之violate使用

    原文: http://blog.chinaunix.net/uid-26694208-id-3345118.html        一个定义为volatile的变量是说这变量可能会被意想不到地改变,这 ...

  2. java类的修饰词有哪些_Java类与对象及访问控制修饰词解析

    Java 是个纯面向对象语言,不支持过程式编程,所有操作都是基于对象. 一.类 类是 Java 中的一种引用数据类型,引用数据类型值都存储在堆中.类是构造对象的模板,每个类对象都是类通过 new 语句 ...

  3. java 哈希表和向量_Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最难理解的多重继承技术 ...

  4. java修饰词严格程度_Java修饰词的总结

    Java语言定义了public.protected.private.abstract.static和final这6常用修饰词外还定义了5 个不太常用的修饰词,下面是对这11个Java修饰词的介绍: 1 ...

  5. c语言修仙角色,C语言修仙手游-C语言修仙手游安卓版V7.4.0预约_第一手游网

    <C语言修仙>是一款非常受玩家欢迎的仙侠冒险角色扮演手游,精致唯美的游戏画面风格,栩栩如生的人物形象,炫酷华丽的技能特效释放,上古的神兽坐骑,最完美的情缘系统,还有完善的社交系统,自由的进 ...

  6. Smarty 中的 if 语句条件修饰词

    Smarty 中的 if 语句和 php 中的 if 语句一样灵活易用,并增加了几个特性以适宜模板引擎. if 必须于 /if 成对出现. 可以使用 else 和 elseif 子句. 可以使用以下条 ...

  7. c语言修仙东君嗯哼,C语言修仙

    熟悉的香气在房间中弥漫开来, 林浔出门吃饭之前打开了窗户企图让香水尽快扩散走. 然而, 晚上再次回到房间的时候, 若有若无的香气再次出现在了他身边. 林浔没有办法,只能破罐子破摔, 关上了窗户,开始和 ...

  8. c语言修仙受控可看吗,强推三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花...

    大家好,我是小龙.今天我给大家推荐三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花! 一<c语言修仙>[一十四洲] [简介]: 林浔是一个程序员,通宵编代码后发现自己身体内多了一 ...

  9. java类修饰词和内部类详解

    java类修饰词和内部类详解 控制属性: 同一类内     同一包内      子类     所有类 public            可             可         可       ...

最新文章

  1. Windows客户端C/C++编程规范“建议”——文件
  2. JDK1.6.0下载安装与环境配置
  3. JSP知识点笔记-基本技术常识
  4. 对家庭网络设备行业的理解
  5. pwm一个时间单位_RK3308——RGB调色灯三路PWM驱动
  6. Leaflet中原生方式实现测量面积
  7. centos 安装java_在CentOS8上编译安装开源EDA工具——Surelog
  8. P1429-平面最近点对(加强版)【分治】
  9. linux mysql数据库定时备份
  10. Hadoop学习总结:Map-Reduce入门
  11. 为什么喜欢软件工程专业_为什么我喜欢自由软件
  12. 有好事?卡巴斯基推出免费杀毒软件
  13. [翻译]JUnit 5 用户手册
  14. HDU 4069 Squiggly Sudoku
  15. ALM11 QC11 官方中文安装包下载
  16. 解决pip pandas 安装提示time out
  17. iOS关于data.bin的文件的解析、存储、读取
  18. Mac新手必备小技巧:一起进阶MAC大神
  19. 多种汉语方言语音落地应用,微软智能语音解锁更多交互场景
  20. 0x0000001a蓝屏代码是什么意思 0x0000001a蓝屏代码怎么解决

热门文章

  1. Unet卷积神经网络架构
  2. linux接路由器没反应,路由器连接网线指示灯没反应完美解决方法
  3. java实现第七届蓝桥杯四平方和
  4. 人人都能成为闪电网络节点:第6章安装lnd
  5. linux里的计划任务
  6. Linux计划任务、周期性任务执行
  7. 【翻译】通过GSoC、GSoD、LFX和Outreachy来庆祝CNCF实习的成功五周年
  8. 【区块链 | 数据上链】星火链网、蚂蚁联盟链等区块链业务系统开发指南
  9. kafka python 性能_使用 Python 监控 Kafka Consumer LAG
  10. 经验正交分解EOF的Matlab的实现示例