C语言 volatile的作用与使用场景
今天完成公司的任务,突然想起来在调试过程中遇到了一个问题是这样的:“我在主函数里面写了一个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的作用与使用场景相关推荐
- java volatile关键字的作用_java volatile关键字作用及使用场景详解
1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShut ...
- C语言volatile关键字的作用
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件告诉缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...
- c语言volatile关键字的作用是什么?
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...
- C语言volatile类型限定符详解
一.volatile类型限定符 volatile是一个类型修饰符(type specifier),就像我们熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量:volatile的作用是作 ...
- 分析Volatile的作用及底层实现原理,面试问一点都不慌!
文章简介 分析volatile的作用以及底层实现原理,这也是大公司喜欢问的问题 内容导航 volatile的作用 什么是可见性 volatile源码分析 01.volatile的作用 在多线程中,vo ...
- Java多线程学习三十七:volatile 的作用是什么?与 synchronized 有什么异同
volatile 是什么 首先我们就来介绍一下 volatile,它是 Java 中的一个关键字,是一种同步机制.当某个变量是共享变量,且这个变量是被 volatile 修饰的,那么在修改了这个变量的 ...
- vc中 volatile 的作用
vc中 volatile 的作用 volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如 操作系统.硬件或者其它线程等.遇到这个关键字声明的变量,编译器对访 ...
- C语言volatile 关键字
什么是volatile关键字 volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译.读取.存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储或读取这个变量的时候,都会直 ...
- java中关键字volatile的作用(转载)
转载:http://blog.csdn.net/orzorz/article/details/4319055 用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对 ...
最新文章
- c语言 枚举定义变量,C语言之枚举的定义以及测试
- 国人主导研发的 HAWQ® 成 Apache® 顶级项目
- 《Go语言圣经》学习笔记 第三章 基础数据类型
- SEO 百度后台主动推送链接
- 交互式图表_如何构建罗马数字转换器和交互式罗马数字图表
- 创建 WPF 不规则窗口
- 丘成桐现身合肥分享发现数学之美 点赞中国科大年轻学子
- android 文件上传,中文utf-8编码
- 外参矩阵(旋转矩阵+平移向量)以及外方位元素的关系
- C语言之文件读写探究(五):rewind、ftell、fseek(文件指针偏移)
- 一入python深似海--浅拷贝与深拷贝
- Linux学习之/etc/init.d/functions详解
- arcpy 土地整治报备坐标文件导出(解决内环问题)
- android apk反编译(Doapk工具和dex2jar工具介绍)
- 《沉默的大多数》 - 王小波
- 红豆角源码--红豆角系统红豆角APP拼团系统源码分享
- 解决win7提示不是正版的问题
- js关闭当前弹出的小窗口并打开新窗口
- 选择框,单选框,组合框,列表框
- 微服务之间的最佳调用方式