volatile - (C语言)

news/2024/11/20 7:13:44/

volatile关键字和const一样都是一种类型修饰符,用它修饰过的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者是其它线程等。

该关键字是不希望被编译器优化,从而达到稳定访问内存的目的。

示例代码:

#include<stdio.h>int main()
{int i = 10;int j = i;int k = i;return 0;
}

 在程序运行起来后,查看反汇编(两个版本):

Debug

 Release --- 进行了代码优化

此时编译器对代码进行了优化,在 int j = i ; int k = i; 这两条语句中,i 没有被作为左值,编译器认为 i 值没有被修改,所以从内存中取出 i 的值赋值给 j 后,这个值并没有被丢掉,而是继续执行了下一条语句,对 k 进行赋值,此时,编译器不会生成新的汇编代码重新从内存中取 i 的值,提高了效率。(Debug)


与上述代码做对比,添加 volatile 后 --- 代码:

#include<stdio.h>int main()
{volatile int i = 10;int j = i;int k = i;return 0;
}

 在程序运行起来后,查看反汇编(两个版本):

Debug

Release --- 进行了代码优化

 

volatile 关键字告知编译器 i 可能随时发生变化,即每一次使用 i 值的时候,都必须从内存中读取出 i 的值。所以编译器生成的汇编代码会重新从 i 的地址处读取数据放在 k 中。(Debug)


 由上述现象可知,如果 i 时一个寄存器变量或者表示一个端口数据或者是多个线程的共享数据,就非常容易发生错误。所以 volatile 可以保证对特殊地址的稳定访问。


思考:const volatile int a = 10; // 该条语句会不会报错

const --- 要求你不要进行写入

volatile --- 在读取数据的时候每次都要从内存中读取

以上两者并不冲突,该代码不会报错

 


volatile变量的⼏个例⼦:
<1> :并⾏设备的硬件寄存器(如:状态寄存器)
<2>:⼀个中断服务⼦程序中会访问到的⾮⾃动变量(Non-automatic variables)
<3>: 多线程应⽤中被⼏个任务共享的变量




 

 

 

 


http://www.ppmy.cn/news/225159.html

相关文章

DNS是什么意思?DNS有什么用?(中科三方)

DNS&#xff0c;是Domain Name System的首字母缩写&#xff0c;中文译作“域名系统”&#xff0c;是记录了域名与IP地址相互映射关系的一个分布式数据库&#xff0c;它使用户通过域名就可以访问互联网&#xff0c;而无需记住复杂容易混淆的IP数字串。 DNS的作用 我们知道计算…

如何设计一个安全的对外接口 ?

前言 最近有个项目需要对外提供一个接口&#xff0c;提供公网域名进行访问&#xff0c;而且接口和交易订单有关&#xff0c;所以安全性很重要&#xff1b;这里整理了一下常用的一些安全措施以及具体如何去实现。 安全措施 个人觉得安全措施大体来看主要在两个方面&#xff0…

如何下载最新的苹果2021年供应商名单?

苹果公布了2021年最新的供应商名单&#xff0c;三步获取最新的PDF文件 第一步&#xff1a;打开工业快搜IOSearch 第二步&#xff1a;输入apple supplier list 并搜索&#xff0c;选择文件格式为PDF 第三步&#xff1a;点击预览后即可下载啦

2021年中国苹果及苹果加工品进出口情况:我国苹果干进出口均价均有所上涨[图]

一、现状 苹果在中国的历史已经很悠久&#xff0c;苹果在中国已经有两千多年的栽培历史。2015-2020年中国苹果种植面积总体稳定&#xff0c; 2020年中国苹果种植面积1942.5千公顷&#xff0c;较2019年增加2.48千公顷。 2015-2020年中国苹果种植面积&#xff08;千公顷&#xf…

ROS:参数的使用与编程方法

目录 一、参数模型二、 创建功能包三、参数命令行的使用(rosparam)四、使用程序来使用参数&#xff08;C&#xff09;4.1创建代码4.2编译4.3运行 一、参数模型 在ROS Master中&#xff0c;存在一个参数服务器&#xff08;Parameter Server&#xff09;&#xff0c;它是一个全局…

Springboot +spring security,基于默认数据库模型实现授权

一.简介 上一篇文章中讲解了如何基于内存模型来实现授权&#xff0c;在这种模型里&#xff0c;用户的信息是保存在内存中的。但是&#xff0c;保存在内存中的信息&#xff0c;是无法持久化的&#xff0c;也就是程序一旦关闭&#xff0c;或者断电等情况发生&#xff0c;内存中的…

Neo4j安装配置教程

目录结构 前言Neoj4简介安装JDKNeo4j安装步骤Neo4j下载解压Neo4j压缩包配置环境变量启动Neo4j执行命令报错&#xff0c;报错信息如下&#xff1a; 启动Neo4j&#xff0c;再次测试浏览器访问Neo4j参考链接 前言 安装所需配件网盘一键下载。以下描述中&#xff0c;官网下载均有描…

鲁大师5月新机性能/流畅/久用榜:蓝绿厂霸榜,天玑9200+与高通骁龙8 Gen2迎来首次交锋

性能榜 6.18年中购物节前夕&#xff0c;一众厂商开始扎堆发布新机冲销量&#xff0c;也导致本月的新发机型数量达到了19款。 从品牌来看&#xff0c;ov两家和其子品牌、独立品牌就占据了十二台。从机型定位来看&#xff0c;本月的手机竞争主要围绕中端市场&#xff0c;除了索尼…