当前位置:网站首页>volatile 关键字(修饰符 volatile 告诉编译器,变量的值可能以程序未明确指定的方式被改变)
volatile 关键字(修饰符 volatile 告诉编译器,变量的值可能以程序未明确指定的方式被改变)
2022-08-10 00:59:00 【泡沫o0】
volatile 关键字作用:防止编译器过度优化,字面意思就是易变的、不可优化的、顺序执行的。
volatile关键字的介绍
由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。
C/C++中volatile用来修饰一个变量,表示这个变量,表示这个变量可以被编译器之外的东西改变。
- 说明
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。
如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值;
如果这个变量由别的程序更新了的话,将出现不一致的现象。
volatile关键字的使用场景
- 并行设备的硬件寄存器
存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
- 一个中断服务子程序中会访问到的非自动变量(全局变量)
中断服务程序中修改的供其它程序检测的变量需要加volatile。
- 多线程应用中被几个任务共享的变量
多任务环境下各任务间共享的标志应该加volatile
volatile关键字的作用
- 不会在两个操作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile就是告诉编译器这种情况.
- 不做常量合并、常量传播等优化.
- 对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值操作,然而对Memory Mapped IO的处理是不能这样优化的。
volatile与mutable关键字的区别
mutable只能用与类变量,不能与const同时使用;在const修饰的方法中,mutable变量数值可以发生改变;
volatile只是运行期变量的值随时可能改变,这种改变即可能来自其他线程,也可能来自外部系统。
另言
有时候没有volatile也可能能正常运行,但是可能修改了编译器的优化级别之后就又不能正常运行了。因此经常会出现debug版本正常,但是release版本却不能正常的问题。所以为了安全起见,只要是等待别的程序修改某个变量的话,就加上volatile关键字。
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的,
边栏推荐
- 基于SSM实现手机销售商城系统
- 什么是持续测试?
- Data storage - the C language
- Minimum number of steps to get out of the maze 2
- -Pickling peanuts-
- Interdepartmental Communication Skills
- Penetration Testing and Offensive and Defense Confrontation - Vulnerability Scanning & Logic Vulnerability (Part1)
- UI遍历的初步尝试
- ITK编译remote库
- 嵌入式Qt-实现两个窗口的切换
猜你喜欢
随机推荐
OSS-访问oss生成的url无法访问,直接下载问题
[论文阅读] Diverse Image-to-Image Translation via Disentangled Representations
【Grpc】报错:status = StatusCode.UNIMPLEMENTED details = ““
你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
【CAS:41994-02-9 |Biotinyl tyramide】Biotinyl tyramide price
ITK编译remote库
R语言使用cox函数构建生存分析回归模型、使用subgroupAnalysis进行亚组分析并可视化森林图
el-input保留一位小数点
什么是 PWA
Not, even the volume of the king to write code in the company are copying and pasting it reasonable?
高校就业管理系统设计与实现
-Chess game-
手把手教你编写性能测试用例
XSS详解及复现gallerycms字符长度限制短域名绕过
pyhton之问~~~~~if __name__ == ‘__main__‘:是什么?
2022金九银十工作潮,怎么样才能成功跳槽面试拿到高薪呢?
MySQL最大连接数限制如何修改
Pagoda measurement - building LightPicture open source map bed system
【论文笔记】基于深度学习的机器人抓取虚拟仿真实验教学系统
C# rounding MidpointRounding.AwayFromZero