当前位置:网站首页>volatile的含义以及用法
volatile的含义以及用法
2022-04-23 15:54:00 【Sola_Ex】
volatile的含义以及用法
前言
前几天被问了到了volatile这个问题,说实在话我对volatile其实仅仅局限于理解成防止被编译器优化的层面,却不知道它实际上需要真正应用到什么样的场合,因此昨天对volatile进行重新学习了一次,也决定写下来记录一下。
volatile的定义
volatile是一个特征修饰符,在编译器上是一个关键字,就跟static、const一样。它最终的目的就是防止需要执行的这条指令被编译器给优化掉了。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
作用
它的作用并不会太神奇,可以举例看看,
EX1:
在一段这样的程序中:
AX_1 = 0;
AX_1 = 1;
AX_1 = 2;
AX_1 = 3;
AX_1 = 4;
毫无以为,最后AX_1的值为4,但是如果我问你,在这段代码中,AX_1是否经历过从0-4的变化?答案是不一定的,为啥呢?因为在不同的编译器环境下,对代码的优化等级是不一样的,甚至有些可是设置到无优化的效果。使用Keil为例子,

很多的优化等级会直接默认在-O3的等级,优化等级越高,产生出来固件的大小也可能会越小,但如果在编程的时候,很多细节的地方不注意,就会直接被编译器优化掉。当然,在这种条件下,AX_1是不可能经理0-4的变化的,它会直接被省略0-3的变化,直接到达了4。在这里我其实同时也产生了一个疑问,假设AX_1是一个状态寄存器呢?当然一般也不会这样去对寄存器去赋值。
EX2:
突发事件,如中断。
其实从volatile的定义里面斜体字可以理解一下,“这变量可能会被意想不到地改变”,中断不就是做着这样的事情嘛?对于中断来说,事件可以是有周期地执行,也可以是无周期地执行,但都是一种突发性的处理,如果突然间进入的中断,然后对某个值进行修改,实际上就是一种意想不到的改变,突发性的。所以对需要修改的变量,使用volatile来修饰,就可以很好避免掉这个问题,当然降低编译器优化等级也许也可以实现,但是这样需要被编译器优化的地方却没被优化掉,对内存来说显得很浪费,所以可以更规范地写还是一件好事。
版权声明
本文为[Sola_Ex]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_42312125/article/details/108483514
边栏推荐
- Go language, array, pointer, structure
- 糖尿病眼底病变综述概要记录
- Config组件学习笔记
- 现在做自媒体能赚钱吗?看完这篇文章你就明白了
- js正则判断域名或者IP的端口路径是否正确
- Redis主从复制过程
- Application case of GPS Beidou high precision satellite time synchronization system
- One brush 314 sword finger offer 09 Implement queue (E) with two stacks
- Spark 算子之groupBy使用
- MySQL Cluster Mode and application scenario
猜你喜欢

One brush 314 sword finger offer 09 Implement queue (E) with two stacks

使用 Bitnami PostgreSQL Docker 镜像快速设置流复制集群

MySQL Cluster Mode and application scenario

R语言中绘制ROC曲线方法二:pROC包

The principle and common methods of multithreading and the difference between thread and runnable

C language --- advanced pointer

建设星际计算网络的愿景

Master vscode remote GDB debugging

Modèle de Cluster MySQL et scénario d'application

Pgpool II 4.3 Chinese Manual - introductory tutorial
随机推荐
Control structure (I)
实现缺省页面
为啥禁用外键约束
Deletes the least frequently occurring character in the string
保姆级Anaconda安装教程
VIM specifies the line comment and reconciliation comment
[self entertainment] construction notes week 2
运维流程有多重要,听说一年能省下200万?
PS为图片添加纹理
Large factory technology implementation | industry solution series tutorials
What if the server is poisoned? How does the server prevent virus intrusion?
【开源工具分享】单片机调试助手(示波/改值/日志) - LinkScope
字符串最后一个单词的长度
Config learning notes component
One brush 314 sword finger offer 09 Implement queue (E) with two stacks
Merging of Shanzhai version [i]
Intersection, union and difference sets of spark operators
Spark 算子之distinct使用
Fastjon2他来了,性能显著提升,还能再战十年
s16.基于镜像仓库一键安装containerd脚本