C语言关键字详解(五)带你全面了解 volatile 关键字
目录
- 一、前言
- 二、最易变的关键字—volatile
- 1、volatile 总体阐述
- 2、CPU运算与内存覆盖
- 3、线程与执行流
- 4、volatile修饰变量
- 三、总结
一、前言
大家好,欢迎来到C语言深度解析专栏—C语言关键字详解第五篇,在本篇中我们将会介绍C语言当中的另外一个重要的关键字 volatile ,相信大家在看完这篇博客后会对 volatile 这个关键字的用法及注意事项有一个系统、全面的认识。
二、最易变的关键字—volatile
volatile 是易变的、不稳定的意思。很多人根本就没见过这个关键字,不知道它的存在。也有很多程序员知道它的存在,但从来没用过它。也正是因为它冷门,所以在面试C语言相关问题的时候,volatile 和 static 、const 这两个关键字一样成为了最经常被问到的问题。
1、volatile 总体阐述
volatile 关键字和 const 一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器,未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。这是C深度剖析中对 volatile 的解释,现在我们可能对这段描述并不感冒,没关系,我们下面对 volatile 进行详细介绍之后再回过头来看它,相信那时,大家对这段话会有不一样的感受。
2、CPU运算与内存覆盖
在介绍 volatile 之前,我们需要先介绍一下CPU运算与内存覆盖相关概念。>如图:这里我们用 flag 标记了一个循环,编译器在执行这条语句的时候为了对循环进行逻辑判断需要CPU参与,而CPU进行逻辑判断的时候是先将变量 flag 加载到寄存器中,再判断循环条件是否为真,为真再执行循环语句,但是我们这里并没有任何东西能够修改我的循环变量flag的值,也就是是,我们定义了一个死循环,那么,为了将这个循环进行下去,CPU就需要不断地将变量flag从内存加载到寄存器中进行逻辑判断,显然,这样效率很低,所以,为了提高效率,CPU会直接将 flag 放在寄存器中,以后CPU每次检测时直接从寄存器中读取 flag 的值,不再从内存中读取,这种情况也被称为 “内存覆盖”。
3、线程与执行流
在我们当下来看,这种做法显然没什么问题,因为我们现在写的代码都是单线程的,只有一个执行流来执行程序,但是一个程序并不是只能是单线程的,当我们以后在学习多线程、多进程代码的时候就会知道,循环变量 flag 是有可能在 while 外部被其他值修改的,当一个和 while 并行存在的逻辑将 flag 改为0时,问题就来了,因为CPU是直接从寄存器中读取 flag 的值进行 while 循环的逻辑判断的,所以当另一个逻辑将 flag 改为0时,while 循环并不会停止,而是会继续执行其中的代码块,从而造成程序逻辑上的错误(关于多线程、多进程的知识大家现在只需要了解就可以,以后会细学)。
4、volatile修饰变量
那么,为了在某些特殊的情况下出现上述的问题,我们应该怎么办呢?我们可以直接在 flag 变量前面加上 volatile 关键字,让CPU不要对 flag 进行优化,每次都继续从内存当中读取 flag 的值。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{volatile int flag = 1;while (flag) {;}return 0;
}
这就是 volatile 关键字修饰变量的作用:让编译器不对被 volatile 修饰的变量进行优化,从而达到稳定访问内存的目的。
注意:虽然 volatile 叫做易变关键字,但这里仅仅是描述它修饰的变量可能会变化,要编译器注意,并不是要求被它修饰的变量必须
变化!这点要特别注意。
三、总结
- 编译器在运行程序时为了提高运行效率,可能会对某些程序进行优化,其中就有可能会将某些需要反复从内存中读取的变量直接放在寄存器当中(这点大家可以和 register 来对比一下),从而造成在多线程情况下程序逻辑错误的问题,为了解决或者避免此类错误,C语言中定义了 volatile 关键字。
- volatile 关键字修饰的变量表示可以被某些编译器,未知的因素更改,比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
更多关键字在下面博客链接
C语言关键字详解(一)auto、register关键字
C语言关键字详解(二)带你全面了解 static
C语言关键字详解(三)数据类型与sizeof关键字
C语言关键字详解(四)带你全面了解 const 关键字
如果你觉得这篇文章对你有帮助的话,还请给个三连支持一下
C语言关键字详解(五)带你全面了解 volatile 关键字相关推荐
- Java static静态关键字详解(public、 private、 volatile)
文章目录 前言 static要解决什么问题? 格式 特点 static静态变量 静态变量和实例变量的区别 static静态方法 static应用场景 static 与volatile static如何 ...
- SeleniumLibrary4.5.0 关键字详解(五)
SeleniumLibrary4.5.0 关键字详解(五) 库版本:4.5.0 库范围:全局 命名参数:受支持 简介 SeleniumLibrary是Robot Framework的Web测试库. 本 ...
- 由ANSI标准定义的C语言关键字,C语言32个关键字详解
C语言中32个关键字详解 由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register ...
- c语言程序关键字是什么,C语言中32个关键字详解
C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...
- C#关键字详解第五节
最近有点忙于追剧<人民的名义>所以并未及时更新,所以大家理解理解,哈哈,这部剧很不错!推荐大家去看看!下面我们继续C#关键字解释!const:常量 一般我们说常量都是以PI(3.14)等举 ...
- c语言关键字extern作用,C语言中extern关键字详解
<C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...
- C语言const关键字详解
C语言的const关键字 const 在实际编程中用得并不多,const 是 constant 的缩写,意思是"恒定不变的"!它是定义只读变量的关键字,或者说 const 是定义常 ...
- synchronized 关键字详解
synchronized关键字详解 文章目录 synchronized关键字详解 一.synchronized简介(是什么) 用户态和内核态: 二.synchronized应用(怎么用) 修饰实例方法 ...
- Java关键字详解-配视频讲解链接(附带一些面试题)
Java中常用的关键字详解-配视频讲解链接(附带一些面试题) 关键字:被Java赋予了特定含义的英文单词.关于关键字的学习贯穿了整个Java的学习,结合应用理解记忆关键字,不能单纯的死记硬背,在这里通 ...
- Java Web中的EL(表达式语言)详解
Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...
最新文章
- html滑动逐渐覆盖效果,创意jQuery和CSS3滑动覆盖响应式幻灯片特效
- Day14 自己定义泛型类的使用
- scws sphinx mysql_Sphinx+Scws 搭建千万级准实时搜索应用场景详解
- Oracle 中UNDO与REDO的差别具体解释
- 帝国CMS模板|中国历史网整站数据MIP源码下载、带Tags提取插件
- 为DbHelper工具类添加关闭资源的方法 jdbc 20210412_212728.mp4
- mysqlreport
- android Launcher——数据加载与变更
- 如何列出npm用户安装的软件包?
- Java中数据输入输出流——DataInputStream和DataOutputStream
- 大学精品课matlab,大学精品课件:Matlab绘图教程.ppt
- wowza 技术交流群/ wowza 流媒体软件交流群
- SDTM submission - 如何处理split domain
- 成对数据T检验实例(用SPSS16.0实现)
- Using a password on the command line interface can be insecure.
- 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral
- JS设置COOKIE,PHP中处理
- 最近使用git的错误----“failed to push some refs to ...”与“On branch master Your branch is up to date with ‘”
- SpringBoot 基于 OAuth2 统一身份认证流程详解
- 你们还不知道这几个批量处理图片大小的方法吗?
热门文章
- 计算机组成原理白中英第四章,白中英计算机组成原理第四章答案.ppt
- Comic Life 3 for Mac(漫画创作工具)
- c语言计算器程序代码有优先级,C语言计算器小程序(源代码+实习报告).doc
- C#反编译软件查看dll文件源码
- 汉诺塔C语言递归实现详解
- linux sh 按键精灵,按键精灵脚本代码教程
- 数学之美 第二版 pdf
- linux给文件备份,Linux文件备份
- Cadence Orcad Capture原理图导出PDF图文视频教程
- 精英主义 遗传算法 matlab,遗传算法matlab程序