今天完成公司的任务,突然想起来在调试过程中遇到了一个问题是这样的:“我在主函数里面写了一个while(x)的循环,想在中断里面去改变这个变量x,以达到主函数里面退出while循环的目的。但是结果并不是这样的,我的代码一直停在了while循环里面。后面我咨询了一位大哥,然后他告诉我在变量i前面加上一个volatile。果然,代码运行和我的预期一样了”。代码如下

void main()
{unsigned char x = 1;while(x){}
}void USART1_IRQHandler(void)
{x = 0 ;
}

那么volatile到底是做什么的呢?查阅了几篇博客,总算是明白了其中的道道。

volatile的本意是“易变的”。因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)

看两个例子:

1、如果你的程序是这样的。

int num = 0 ;
num = 1;
num = 2;

如上,你的编译器就会去去优化你的代码,可能被优化成这样:

int num = 0 ;
num = 2;

结果“num = 1;”这条指令就丢失了。

但是如果你加上了volatile,你的代码变成了这样:

volatile int num = 0 ;
num = 1;
num = 2;

那么你的编译器就不再会去优化你的代码,你编译出来的指令还是三条。

2、当你遇到博主上面的情况时,你也应该加上volatile。第二种使用volatile的情况就是,在某个函数中定义的变量可能在函数外面被改变的情况,你就应该加上volatile,保证每次都必须从内存中读取数据,而不能重复使用放在cache或寄存器中的备份。

这种情况,尤其是在单片机程序,需要在中断程序中,改变某个变量的时候,用的特别多。

3、当然还有其他一些使用volatile的情况,如,存储器映射的硬件寄存器通常也要加voliate,因为每次对它的读写都可能有不同意义。

#define __I volatile const /*!< defines 'read only' permissions */
#define __O volatile /*!< defines 'write only' permissions */
#define __IO volatile /*!< defines 'read / write' permissions */

你看你很少见到volatile,但是你肯定见到过__O、__I、__IO,被这三个定义的变量,都是必须从内存中去读值的。

好,说完了。一句话总结一下,volatile到底有什么用。它的作用就是叫编译器不要偷懒,去内存中去取值

C语言 volatile的作用与使用场景相关推荐

  1. java volatile关键字的作用_java volatile关键字作用及使用场景详解

    1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...

  2. C语言volatile关键字的作用

    一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件告诉缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...

  3. c语言volatile关键字的作用是什么?

    一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...

  4. C语言volatile类型限定符详解

    一.volatile类型限定符 volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量:volatile的作用是作 ...

  5. 分析Volatile的作用及底层实现原理,面试问一点都不慌!

    文章简介 分析volatile的作用以及底层实现原理,这也是大公司喜欢问的问题 内容导航 volatile的作用 什么是可见性 volatile源码分析 01.volatile的作用 在多线程中,vo ...

  6. Java多线程学习三十七:volatile 的作用是什么?与 synchronized 有什么异同

    volatile 是什么 首先我们就来介绍一下 volatile,它是 Java 中的一个关键字,是一种同步机制.当某个变量是共享变量,且这个变量是被 volatile 修饰的,那么在修改了这个变量的 ...

  7. vc中 volatile 的作用

    vc中 volatile 的作用 volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如 操作系统.硬件或者其它线程等.遇到这个关键字声明的变量,编译器对访 ...

  8. C语言volatile 关键字

    什么是volatile关键字 volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译.读取.存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储或读取这个变量的时候,都会直 ...

  9. java中关键字volatile的作用(转载)

    转载:http://blog.csdn.net/orzorz/article/details/4319055 用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对 ...

最新文章

  1. c语言 枚举定义变量,C语言之枚举的定义以及测试
  2. 国人主导研发的 HAWQ® 成 Apache® 顶级项目
  3. 《Go语言圣经》学习笔记 第三章 基础数据类型
  4. SEO 百度后台主动推送链接
  5. 交互式图表_如何构建罗马数字转换器和交互式罗马数字图表
  6. 创建 WPF 不规则窗口
  7. 丘成桐现身合肥分享发现数学之美 点赞中国科大年轻学子
  8. android 文件上传,中文utf-8编码
  9. 外参矩阵(旋转矩阵+平移向量)以及外方位元素的关系
  10. C语言之文件读写探究(五):rewind、ftell、fseek(文件指针偏移)
  11. 一入python深似海--浅拷贝与深拷贝
  12. Linux学习之/etc/init.d/functions详解
  13. arcpy 土地整治报备坐标文件导出(解决内环问题)
  14. android apk反编译(Doapk工具和dex2jar工具介绍)
  15. 《沉默的大多数》 - 王小波
  16. 红豆角源码--红豆角系统红豆角APP拼团系统源码分享
  17. 解决win7提示不是正版的问题
  18. js关闭当前弹出的小窗口并打开新窗口
  19. 选择框,单选框,组合框,列表框
  20. 微服务之间的最佳调用方式

热门文章

  1. apply通过实例理解
  2. android 第三方登录 --- QQ
  3. Linux下安装Tomcat7
  4. 更改Firefox为中文界面(Ubuntu系统)
  5. BCP 导入导出数据库数据
  6. Linux很有用的根据字符串查找符合条件的命令
  7. 传iPhone 4S下月初开卖
  8. Android获取手机短信
  9. WinCE文件目录定制及内存调整
  10. 利用脚本将文字插入到图片或进行多个图片拼接