当前位置:网站首页>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修饰,表明这个对象体现常量语义,但同时可能被当前对象所在程序上下文意外的情况修改。
边栏推荐
- QT | UDP broadcast communication, simple use case
- CCNA Cisco network EIGRP protocol
- Anaconda installs third-party packages
- 2500个常用中文字符 + 130常用中英文字符
- 自制J-Flash烧录工具——Qt调用jlinkARM.dll方式
- Codeforces Round #274 (Div. 2) –A Expression
- Four data streams of grpc
- Force buckle 575 Divide candy
- GNN,请你的网络层数再深一点~
- Force deduction question 500, keyboard line, JS implementation
猜你喜欢
第3章:类的加载过程(类的生命周期)详解
pytorch_YOLOX剪枝【附代码】
3DMax指定面贴图
UNI-Admin基础框架怎么关闭创建超级管理员入口?
硬件開發筆記(十): 硬件開發基本流程,制作一個USB轉RS232的模塊(九):創建CH340G/MAX232封裝庫sop-16並關聯原理圖元器件
[sciter]: encapsulate the notification bar component based on sciter
Hardware development notes (10): basic process of hardware development, making a USB to RS232 module (9): create ch340g/max232 package library sop-16 and associate principle primitive devices
PVL EDI project case
Management background --5, sub classification
C#實現水晶報錶綁定數據並實現打印4-條形碼
随机推荐
The nearest common ancestor of binary (search) tree ●●
软考高级(信息系统项目管理师)高频考点:项目质量管理
【sdx62】WCN685X将bdwlan.bin和bdwlan.txt相互转化操作方法
GPS from getting started to giving up (XV), DCB differential code deviation
C#实现水晶报表绑定数据并实现打印4-条形码
手写ABA遇到的坑
CCNA Cisco network EIGRP protocol
GPS from getting started to giving up (XVIII), multipath effect
PVL EDI project case
GNN, please deepen your network layer~
墨西哥一架飞往美国的客机起飞后遭雷击 随后安全返航
HDR image reconstruction from a single exposure using deep CNNs阅读札记
Assembly and Interface Technology Experiment 6 - ADDA conversion experiment, AD acquisition system in interrupt mode
GPS from getting started to giving up (12), Doppler constant speed
2020 Bioinformatics | GraphDTA: predicting drug target binding affinity with graph neural networks
解决项目跨域问题
SQL Server生成自增序号
HDR image reconstruction from a single exposure using deep CNN reading notes
硬件開發筆記(十): 硬件開發基本流程,制作一個USB轉RS232的模塊(九):創建CH340G/MAX232封裝庫sop-16並關聯原理圖元器件
What a new company needs to practice and pay attention to