千家信息网

C语言中volatile关键字详细介绍

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,本篇内容主要讲解"C语言中volatile关键字详细介绍",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C语言中volatile关键字详细介绍"吧!C语言中
千家信息网最后更新 2024年11月24日C语言中volatile关键字详细介绍

本篇内容主要讲解"C语言中volatile关键字详细介绍",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C语言中volatile关键字详细介绍"吧!

C语言中volatile关键字

volatile关键字是C语言中非常冷门的关键字,因为用到这个关键字的场景并不多。

当不用这个关键字的时候,CPU可能会对我们的代码做一定的优化:

内存中的数据要放入CPU中进行运算或控制,而这个数据的值是被放入寄存器中,然后再将寄存器中的数据进行运算或控制的,对于一个死循环int flag=1;while(flag);来说;如果进行优化,则下次循环则不需要再次将flag内存中的值放入寄存器中,而是直接使用寄存器中已有的值进行循环;如果不进行优化,则下次还需要将flag内存中的值放入寄存器中,然后使用寄存器中的数据。

总结起来就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对其地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。

这两种情况在单线程的情况下区别不大,但是在多线程的情况下可能会有其他逻辑将flag修改为0,如果进行优化,则死循环不会停下来。

所以volatile的作用就是让变量不要被CPU优化,达到稳定访问内存的目的。

比如下面的代码:

我们在gcc下使用命令gcc test.c -O2 -g将代码进行优化,然后用命令objdump -S -d a.out > a.s将优化后的汇编代码放入a.s文件中,再用vim a.s查看a.s文件:

程序会一直在这一句代码中死循环:

加入volatile后:

再用相同的命令查看a.s文件:

可以看到每次循环都会读取pass的数据。

结论: volatile 忽略编译器的优化,保持内存可见性。

另外,const和volatile是不冲突的:

const volatile int a = 10;

const关键字要求变量a不能直接被写入,而volatile关键字要求每次读取数据的时候,都要从a所在的内存中读取,并不会改变变量a的值。

到此,相信大家对"C语言中volatile关键字详细介绍"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

关键 关键字 代码 内存 寄存器 数据 循环 语言 变量 a.s 命令 情况 文件 编译器 编译 内容 就是 时候 线程 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全在身边征文一等奖 如何从服务器上查看网站后台管理 齐鲁师范学院教务系统服务器地址 网络安全真实事件案例 mysql怎么开启本地数据库 数据分析师没有数据库权限 后台服务器需要磁盘吗 北京文档软件开发多少钱 乡镇信息网络安全制度 怀旧服各个服务器介绍 数据库结果存入集合 网络安全评测公司 如何查看数据库链接没释放 天骐多人服务器卡丁车 武汉app软件开发外包 客户机与服务器如何设置静态ip webex云服务软件开发 美萍管理软件选择服务器 新氧科技和美国互联网 双11网络安全提示 解密pc版微信数据库 创客空间网络安全 北京文档软件开发多少钱 ios付费软件开发 软件测试是与软件开发密切相关 腾讯云服务器管理工具 倡导文明上网共守网络安全手抄报 服务器远程管理卡配置教程 数据库课程实验做什么 网络安全与国家安全 论文
0