当前位置:网站首页>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
边栏推荐
- 字符串最后一个单词的长度
- Neodynamic Barcode Professional for WPF V11.0
- Modèle de Cluster MySQL et scénario d'application
- Implement default page
- C language self compiled string processing function - string segmentation, string filling, etc
- 多线程原理和常用方法以及Thread和Runnable的区别
- Accumulation of applet knowledge points
- JS regular determines whether the port path of the domain name or IP is correct
- 实现缺省页面
- JVM - Chapter 2 - class loader subsystem
猜你喜欢
Master vscode remote GDB debugging
Unity Shader学习
Application of Bloom filter in 100 million flow e-commerce system
Spark 算子之groupBy使用
One brush 314 sword finger offer 09 Implement queue (E) with two stacks
API IX JWT auth plug-in has an error. Risk announcement of information disclosure in response (cve-2022-29266)
Groupby use of spark operator
现在做自媒体能赚钱吗?看完这篇文章你就明白了
CVPR 2022 quality paper sharing
Why disable foreign key constraints
随机推荐
One brush 314 sword finger offer 09 Implement queue (E) with two stacks
PHP function
shell脚本中的DATE日期计算
MySQL - execution process of MySQL query statement
Single architecture system re architecture
运维流程有多重要,听说一年能省下200万?
Date date calculation in shell script
PHP classes and objects
Redis主从复制过程
How important is the operation and maintenance process? I heard it can save 2 million a year?
Go language slice, range, set
Spark 算子之distinct使用
C language self compiled string processing function - string segmentation, string filling, etc
怎么看基金是不是reits,通过银行购买基金安全吗
王启亨谈Web3.0与价值互联网“通证交换”
matplotlib教程05---操作图像
Merging of Shanzhai version [i]
Import address table analysis (calculated according to the library file name: number of imported functions, function serial number and function name)
Go语言数组,指针,结构体
VIM specifies the line comment and reconciliation comment