当前位置:网站首页>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修饰,表明这个对象体现常量语义,但同时可能被当前对象所在程序上下文意外的情况修改。
边栏推荐
- Problems in the process of opencv300 cmake generating project
- QT | UDP broadcast communication, simple use case
- HDU 2008 digital statistics
- AI 企业多云存储架构实践 | 深势科技分享
- Oracle-控制文件及日志文件的管理
- [leetcode daily clock in] 1020 Number of enclaves
- 0 basic learning C language - digital tube
- Applet system update prompt, and force the applet to restart and use the new version
- 2022年6月国产数据库大事记-墨天轮
- Unity3d minigame unity webgl transform plug-in converts wechat games to use dlopen, you need to use embedded 's problem
猜你喜欢
3DMAX assign face map
2022-07-04 mysql的高性能数据库引擎stonedb在centos7.9编译及运行
Crawler obtains real estate data
数据处理技巧(7):MATLAB 读取数字字符串混杂的文本文件txt中的数据
[linear algebra] determinant of order 1.3 n
Build op-tee development environment based on qemuv8
Management background --4, delete classification
硬件開發筆記(十): 硬件開發基本流程,制作一個USB轉RS232的模塊(九):創建CH340G/MAX232封裝庫sop-16並關聯原理圖元器件
新手程序员该不该背代码?
[MySQL] online DDL details
随机推荐
ResNet-RS:谷歌领衔调优ResNet,性能全面超越EfficientNet系列 | 2021 arxiv
NPDP认证|产品经理如何跨职能/跨团队沟通?
i. Mx6ull build boa server details and some of the problems encountered
Barcodex (ActiveX print control) v5.3.0.80 free version
Assembly and interface technology experiment 5-8259 interrupt experiment
HDR image reconstruction from a single exposure using deep CNN reading notes
解决项目跨域问题
Assembly and Interface Technology Experiment 6 - ADDA conversion experiment, AD acquisition system in interrupt mode
[linear algebra] determinant of order 1.3 n
Unity3d minigame-unity-webgl-transform插件转换微信小游戏报错To use dlopen, you need to use Emscripten‘s...问题
2021 geometry deep learning master Michael Bronstein long article analysis
网络基础入门理解
RESNET rs: Google takes the lead in tuning RESNET, and its performance comprehensively surpasses efficientnet series | 2021 arXiv
[leetcode daily clock in] 1020 Number of enclaves
QT | UDP broadcast communication, simple use case
Build op-tee development environment based on qemuv8
Data storage (1)
每日一题:力扣:225:用队列实现栈
3DMax指定面贴图
Unity3D学习笔记6——GPU实例化(1)