今天完成公司的任务,突然想起来在调试过程中遇到了一个问题是这样的:“我在主函数里面写了一个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. 避免使用aireplay-ng指令时出现AP通道不对的方法
  2. mysql怎样删除上一行_mysql如何删除第一行数据
  3. 23种设计模式中的蝇量(享元)模式
  4. Atlassian In Action - (Atlassian成长之路)
  5. Android之用户定位(二)
  6. webservice / cxf 开发经验总结
  7. 解题报告——习题2-5 分数化小数(decimal) 输入正整数a,b,c,输出a/b的小数形式,精确到小数点后c位。
  8. Spring期末试题
  9. SAP Cloud for Customer销售订单External Note的建模细节
  10. C++定义隐式转换函数,将类转换为内部的一个成员变量
  11. 史上最全的Visual Studio Code安装C/C++环境,若不行头砍给你。
  12. 在linux下安装python3_【转】在Linux下安装python3
  13. 在Ubuntu上安装misterhouse
  14. java tomcat 教程_从零开始学习 JavaWeb - 02Tomcat教程
  15. python3callable使用_python --- Python中的callable 函数
  16. C# combobox SelectedText值为空
  17. [转载] 语言程序设计第4版黄洪艺_计算机二级教程 Python语言程序设计 第8章python计算生态...
  18. 知识图谱基础入门(二)
  19. 最新版c语言经典习题100例(最全面)
  20. c语言 计算华氏温度

热门文章

  1. win7 telnet命令无法使用
  2. 一个非常棒的jQuery 评分插件--好东西要分享
  3. cs_EmailQueue_Failure///cs_Emails_Dequeue///cs_Emails_Enqueue
  4. Android 编译命令
  5. 如何查看计算机里家庭组有几个,win7网络文件夹-win7家庭组共享的文件在哪儿查?win7 – 手机爱问...
  6. mongo忘记密码并删除用户
  7. 郑州尚学堂:JAVA常用4种排序方法
  8. mysql 5.6到percona 5.6小版本升级
  9. java web mvc思想介绍
  10. 用SparseArray代替HashMap