当前位置:网站首页>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的字面含义是易变的,
边栏推荐
猜你喜欢
GB28181 sip和RTSP(Real-Time Streaming Protocol)实时流控制协议
Unity image is blurry after using long image
惊掉你下巴,程序员编码竟然可以被 996 指数化
unity编辑器扩展界面使用 List
Teach you how to write performance test cases
Biotin-Cy2 Conjugate, Biotin-Cy2 Conjugate_Cy2 Biotin Conjugate
OpenSSF的开源软件风险评估工具:Scorecards
Pyscript,创建一个能执行crud操作的网页应用
DHCP——动态主机配置协议
Web性能测试模型小结
随机推荐
oracle的数据导入导出
Minimum number of steps to get out of the maze 2
ABAP 里文件操作涉及到中文字符集的问题和解决方案
基于FTP协议实现文件上传与下载
-Pickling peanuts-
【UNR #6 B】机器人表演(DP)
D-Biotinol Involved by Biotin, CAS No: 53906-36-8 Specific Properties Description
hint: Updates were rejected because the tip of your current branch is behind hint: its remote counte
Unity vertex animation
Experimental support for decorators may change in future releases.Set the "experimentalDecorators" option in "tsconfig" or "jsconfig" to remove this warning
[论文阅读] Diverse Image-to-Image Translation via Disentangled Representations
RedHat红帽RHEL7安装与使用,VMware Workstation16 Pro虚拟机的安装与使用
跨部门沟通的技巧
Quick responsiveness intelligent/smart responsiveness of polyethylene glycol type nano/reduction response hydrogels research and preparation
宽带由20M换为100M
万字总结:分布式系统的38个知识点
Unity image使用长图后 图片很糊
【论文笔记】基于深度学习的机器人抓取虚拟仿真实验教学系统
[LeetCode] Find the sum of the numbers from the root node to the leaf node
高校就业管理系统设计与实现