当前位置:网站首页>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
边栏推荐
- Config learning notes component
- Codejock Suite Pro v20.3.0
- Upgrade MySQL 5.1 to 5.611
- MySQL - execution process of MySQL query statement
- pgpool-II 4.3 中文手册 - 入门教程
- Tencent offer has been taken. Don't miss the 99 algorithm high-frequency interview questions. 80% of them are lost in the algorithm
- MetaLife与ESTV建立战略合作伙伴关系并任命其首席执行官Eric Yoon为顾问
- Redis master-slave replication process
- Spark 算子之交集、并集、差集
- leetcode-396 旋转函数
猜你喜欢
[open source tool sharing] MCU debugging assistant (oscillograph / modification / log) - linkscope
多生成树MSTP的配置
New developments: new trends in cooperation between smartmesh and meshbox
Pgpool II 4.3 Chinese Manual - introductory tutorial
Merging of Shanzhai version [i]
CAP定理
Why disable foreign key constraints
The principle and common methods of multithreading and the difference between thread and runnable
What if the server is poisoned? How does the server prevent virus intrusion?
建设星际计算网络的愿景
随机推荐
Basic greedy summary
Best practices of Apache APIs IX high availability configuration center based on tidb
vim指定行注释和解注释
实现缺省页面
shell脚本中的DATE日期计算
R语言中绘制ROC曲线方法二:pROC包
Go并发和通道
字符串最后一个单词的长度
Modèle de Cluster MySQL et scénario d'application
Spark 算子之partitionBy
现在做自媒体能赚钱吗?看完这篇文章你就明白了
时序模型:长短期记忆网络(LSTM)
pgpool-II 4.3 中文手册 - 入门教程
Spark 算子之groupBy使用
Open source project recommendation: 3D point cloud processing software paraview, based on QT and VTK
提取不重复的整数
Single architecture system re architecture
CAP定理
Temporal model: long-term and short-term memory network (LSTM)
Upgrade MySQL 5.1 to 5.67