当前位置:网站首页>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的字面含义是易变的,
边栏推荐
- 改变社交与工作状态的即时通讯是什么呢?
- JVM :运行时数据区-虚拟机栈
- 这一次,话筒给你:向自由软件之父 Richard M. Stallman 提问啦!
- 彩色袜子题
- 以太网PHY芯片LAN8720A芯片研究
- Shader Graph learns various special effects cases
- Summary of basic operations of c language files
- 03|Process Control
- UI遍历的初步尝试
- Problems and solutions related to Chinese character set in file operations in ABAP
猜你喜欢
Sikuli 基于图形识别的自动化测试技术
OpenSSF的开源软件风险评估工具:Scorecards
MySQL最大连接数限制如何修改
【CAS:41994-02-9 |Biotinyl tyramide】Biotinyl tyramide price
卷积神经网络识别验证码
Quick responsiveness intelligent/smart responsiveness of polyethylene glycol type nano/reduction response hydrogels research and preparation
XSS详解及复现gallerycms字符长度限制短域名绕过
彩色袜子题
跳房子游戏
Unity editor extension interface uses List
随机推荐
RedHat红帽RHEL7安装与使用,VMware Workstation16 Pro虚拟机的安装与使用
unity编辑器扩展界面使用 List
R语言使用cox函数构建生存分析回归模型、使用subgroupAnalysis进行亚组分析并可视化森林图
基于设计稿识别的可视化低代码系统实践
2022金九银十工作潮,怎么样才能成功跳槽面试拿到高薪呢?
PEG derivative Biotin-PEG1-OH (cas: 95611-10-2, 2-biotinaminoethanol) advantage description
头脑风暴:单词拆分
阿里云混合云管理平台多Region架构
Experimental support for decorators may change in future releases.Set the "experimentalDecorators" option in "tsconfig" or "jsconfig" to remove this warning
egg.js中Class constructor BaseContextClass cannot be invoked without ‘new‘解决方法
Prometeus 2.31.0 新特性
ABAP 里文件操作涉及到中文字符集的问题和解决方案
基于Web的疫情隔离区订餐系统
罗彻斯特大学 | 现在是什么序列?蛋白质序列的贝叶斯优化的预训练集成
pyhton之问~~~~~if __name__ == ‘__main__‘:是什么?
人际关系不仅要“存”,更要“激活”!
R语言使用glm函数构建逻辑回归模型(logistic)、使用subgroupAnalysis函数进行亚组分析并可视化森林图
卷积神经网络识别验证码
五种定位——粘性定位
基于FTP协议实现文件上传与下载