原文: http://blog.chinaunix.net/uid-26694208-id-3345118.html       

一个定义为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

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

  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. 生产中NFS案例记录---写入权限解决过程
  2. IntelliJ IDEA 最常用配置,应用、永久激活
  3. LINQ圣经——《LINQ实战》
  4. Struts1和Struts2对照
  5. 【码农本色】用数据解读我的2014
  6. Nginx的启动和停止
  7. 【MM模块】Batch 批次管理 2
  8. UVA 10271 Chopsticks
  9. SSH配置启动后Could not instantiate bean class [org.hibernate.cfg.AnnotationConfiguration
  10. java分布式集群框架_Cacheonix——Java的分布式集群缓存框架
  11. 计算机绘图作业1,开放大学CAD绘图实训形考作业1
  12. 螃蟹辞职 大数据冲击网络社交 魔兽世界如何前进
  13. NOI Online Round 3 总结
  14. 宋朝历史衰败原因大揭秘
  15. 01-Java中的集合
  16. 全球及中国农药市场需求走势与十四五发展商机研究报告2022版
  17. 时间序列分析教程(一):基本性质
  18. 蓝桥杯真题:天干地支
  19. [ARC 102C]Triangular Relationship
  20. 在Excel中怎样快速对数据进行求和?分享4种求和方法

热门文章

  1. wget命令详解,断点续传
  2. cmake-gui使用教程
  3. soot基础 -- soot 中的处理阶段
  4. J2EE 框架结构及核心技术基础面面观
  5. python模块之 paramiko
  6. Mac环境下安装MongoDB数据库
  7. 设计抗混叠滤波器的三个指导原则--日记
  8. 量化交易系列【4】高频函数:rolling与expanding用法
  9. libusb 串口 android,libusb开发通讯问题
  10. dreamweaver如何连接mysql_Dreamweaver连接数据库教程(ASP类)