当前位置:网站首页>volatile关键字
volatile关键字
2022-07-06 14:40:00 【是北豼不太皮吖】
volatile关键字
volatile 关键字和 const 一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
先看看下面的例子:
int i=10;
int j = i; //(1)语句
int k = i; //(2)语句
这时候编译器对代码进行优化,因为在(1)、(2)两条语句中,i 没有被用作左值。这时候编译器认为 i 的值没有发生改变,所以在(1)语句时从内存中取出 i 的值赋给 j 之后,这个值并没有被丢掉,而是在(2)语句时继续用这个值给 k 赋值。编译器不会生成出汇编代码重新从内存里取 i 的值,这样提高了效率。但要注意:(1)、(2)语句之间 i 没有被用作左值才行。
再看另一个例子:
volatile int i=10;
int j = i; //(3)语句
int k = i; //(4)语句
volatile 关键字告诉编译器 i 是随时可能发生变化的,每次使用它的时候必须从内存中取出 i 的值,因而编译器生成的汇编代码会重新从 i 的地址处读取数据放在 k 中。
这样看来,如果 i 是一个寄存器变量或者表示一个端口数据或者是多个线程的共享数据,就容易出错,所以说 volatile 可以保证对特殊地址的稳定访问。
const volatile int i=10;这行代码有没有问题?如果没有,那 i 到底是什么属性?
回答一:没有问题,例如只读的状态寄存器。它是volatile,因为它可能被意想不到地改变;它是const,因为程序不应该试图去修改它。volatile和const并不矛盾,只是控制的范围不一样,一个在程序本身之外,另一个是程序本身。
回答二:没问题,const和volatile这两个类型限定符不矛盾。const表示(运行时)常量语义:被const修饰的对象在所在的作用域无法进行修改操作,编译器对于试图直接修改const对象的表达式会产生编译错误。volatile表示“易变的”,即在运行期对象可能在当前程序上下文的控制流以外被修改(例如多线程中被其它线程修改;对象所在的存储器可能被多个硬件设备随机修改等情况):被volatile修饰的对象,编译器不会对这个对象的操作进行优化。一个对象可以同时被const和volatile修饰,表明这个对象体现常量语义,但同时可能被当前对象所在程序上下文意外的情况修改。
边栏推荐
- 2020 Bioinformatics | GraphDTA: predicting drug target binding affinity with graph neural networks
- Embedded common computing artifact excel, welcome to recommend skills to keep the document constantly updated and provide convenience for others
- 中国固态氧化物燃料电池技术进展与发展前景报告(2022版)
- Barcodex (ActiveX print control) v5.3.0.80 free version
- GPS from getting started to giving up (12), Doppler constant speed
- Report on technological progress and development prospects of solid oxide fuel cells in China (2022 Edition)
- 做接口测试都测什么?有哪些通用测试点?
- lora同步字设置
- What are the interface tests? What are the general test points?
- Build op-tee development environment based on qemuv8
猜你喜欢
ResNet-RS:谷歌领衔调优ResNet,性能全面超越EfficientNet系列 | 2021 arxiv
墨西哥一架飞往美国的客机起飞后遭雷击 随后安全返航
BarcodeX(ActiveX打印控件) v5.3.0.80 免费版使用
C#實現水晶報錶綁定數據並實現打印4-條形碼
PVL EDI project case
二叉(搜索)树的最近公共祖先 ●●
HDR image reconstruction from a single exposure using deep CNN reading notes
网络基础入门理解
Daily question 1: force deduction: 225: realize stack with queue
Search element topic (DFS)
随机推荐
硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
新手程序员该不该背代码?
2020 Bioinformatics | GraphDTA: predicting drug target binding affinity with graph neural networks
MySQL数据库基本操作-DML
[10:00 public class]: basis and practice of video quality evaluation
Support multiple API versions in flask
Attack and defense world miscall
Management background --4, delete classification
PVL EDI 项目案例
GPS from entry to abandonment (XVII), tropospheric delay
ZABBIX proxy server and ZABBIX SNMP monitoring
AI 企业多云存储架构实践 | 深势科技分享
RESNET rs: Google takes the lead in tuning RESNET, and its performance comprehensively surpasses efficientnet series | 2021 arXiv
Aardio - 封装库时批量处理属性与回调函数的方法
SQL Server生成自增序号
2500 common Chinese characters + 130 common Chinese and English characters
Chapter 3: detailed explanation of class loading process (class life cycle)
Data processing skills (7): MATLAB reads the data in the text file TXT with mixed digital strings
zabbix 代理服务器 与 zabbix-snmp 监控
GD32F4XX串口接收中断和闲时中断配置