一个定义为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 可以保证对特殊地址的稳定访问。

violate 修饰的用法相关推荐

  1. python修饰符用法_c#教程之C#语言中的修饰符汇总

    https://www.xin3721.com/eschool/python.html 修饰符是用于限定类型以及类型成员的申明的一种符号. 下面主要从C#中的访问修饰符,作用于类和结构的修饰符,用在方 ...

  2. 【干货】PS图像修复与修饰工具用法

    我们经常会遇到照片未照好需要修复,摄影后期处理,需要用他人做的海报修改为适合自己需求的海报,那么掌握PS的图像修复与修饰的技法则是不言而喻的. 复制图像 仿制图章工具 图案图章工具 修复图像 污点修复 ...

  3. python中@修饰符用法

    @修饰符  '@'符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行.也就是说@A def f(): 是非法的. 只可以在模块或类定义层内对函 ...

  4. violate关键字的用法

    由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化.比如: static int i=0; int main(void) { ... while (1) { if (i) ...

  5. java abstract修饰符用法

    认识abstract abstract一般用来修饰类和方法,不能修饰变量 1.abstract修饰类 abstract修饰类,会使得类变成抽象类,抽象类不能生成实例,但是可以作为对象变量声明的类型,也 ...

  6. violate原理和用法

    知识总结:https://blog.csdn.net/it_dx/article/details/70045286?locationNum=4&fps=1 面试官的思路:https://blo ...

  7. C语言-指针-基础用法、运算、指针与数组、指针数组、多级指针、void指针和const修饰符-学习笔记08

    文章目录 1. 地址和变量 2. 指针 2.1 基本声明 2.2 指针的目标 3. 指针的运算 3.1 指针的赋值运算 3.2 指针的算术运算 3.2.1 指针与常量的加法与减法 3.2.2 两指针相 ...

  8. .WM_CTLCOLOR和OnCtlColor消息的用法

    在每一个控件需要被绘制时都会调用OnCtlColor,因此会被调用多次 对话框背景绘制时会被调用一次,其次是对话框上的子控件绘制时会调用! HBRUSH CMultiThreadDlg::OnCtlC ...

  9. 图解Python多修饰器时哪个先起作用

    修饰器本质上是一个函数,它接收一个函数作为参数并返回一个修饰过的新函数,一般来说不会改变函数的功能,只是在外围增加一些辅助性的检查或小功能. 在拙作<Python程序设计开发宝典>中有下面 ...

最新文章

  1. SpringBoot自动配置的原理及实现
  2. 微信小程序项目重构之Redux状态管理
  3. 初等数学O 集合论基础 第四节 二元关系、等价类与运算
  4. 十九、面试必考,Java中的this关键字
  5. 学生党专用计算机,开学在即何必纠结?学生党专用显卡推荐
  6. vue css load,vue css3loadding插件的开发以及npm包的发布管理
  7. C# 字典键值对排序 属性的key和value排序
  8. 为什么我推荐你用Ubuntu开发?
  9. Html5下载功能实现
  10. 一种基于复制粘贴的cam350邮票孔拼版教程(三) 导出钻孔文件
  11. 搭建webservice服务报错求解
  12. PDF文件保密和去除密码
  13. 计算机打印不了测试纸,win10系统打印机无法打印测试页的解决办法
  14. 橡皮擦的英语_英语单词这样写,老师想扣卷面分都难!(建议收藏学习)
  15. 中国旅行包行业市场供需与战略研究报告
  16. 英文数字验证码识别包
  17. Windows 7设备管理器有未知设备怎么办?
  18. 核子公式——量化IT团队绩效
  19. Time Limit Exceeded的原因及避免方法
  20. 塞拉利昂首次秘密进行基于区块链的总统选举

热门文章

  1. Linux基础系列—Linux体系结构和Linux内核结构
  2. 卷积神经网络(CNN)和循环神经网络(RNN)有什么区别?
  3. 根据电路建立微分方程
  4. IndexedDB踩坑必须注意点!!!
  5. 【华为思科】访问web服务器
  6. 计算机论文要多少截图,毕业论文可以用截图吗 毕业论文注意事项
  7. x86架构学习笔记实模式
  8. 使用CSS设置重叠层次
  9. 高校学生考勤管理系统设计与简单实现
  10. 简历中使用STAR法则