C语言关键字详解(五)带你全面了解 volatile 关键字

article/2025/10/20 4:18:06

目录

  • 一、前言
  • 二、最易变的关键字—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 关键字

如果你觉得这篇文章对你有帮助的话,还请给个三连支持一下


http://chatgpt.dhexx.cn/article/Aaytw6Z9.shtml

相关文章

c语言关键字之auto

文章目录 1.c语言中&#xff0c;关键字auto用于声明一个变量为自动变量2.c语言中&#xff0c;只使用auto修饰变量&#xff0c;变量的类型默认为整型3.c中&#xff0c;关键字auto是一个类型说明符题目&#xff1a;编写一段程序&#xff0c;读入一段包含标点符号和空格的字符串&a…

C语言深度解剖——C语言关键字

每天进步一点点&#xff0c;坚持带来大改变&#xff01;&#xff01;&#xff01; 前言&#xff1a; 在C语言的学习过程中会遇到许多的关键字&#xff0c;我们是否真的详细了解这些关键字的使用方法和使用场景&#xff0c;下面我们来详解C语言中的32个关键字 1.C语言关键字概览…

c语言标识符与关键字的关系,C语言关键字与标识符

没有人有资格干涉你的梦想&#xff0c;同样的&#xff0c;也没有人有义务支持你的梦想。能让你坚持或放弃的&#xff0c;终究只有你自己。 标识符 只能以数字&#xff0c;字母和下划线组成&#xff0c;但第一个不能以数字开头。用户自己使用一般第一个也不用下划线(当然也不会出…

c语言什么是关键字,c语言关键字是什么

c语言关键字是什么&#xff1f; c语言关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字。 C语言简洁、紧凑&#xff0c;使用方便、灵活。ANSI C标准C语言共有32个关键字&#xff0c;9种控制语句&#xff0c;程序书写形式自由&#xff0c;区分大小写。把高级语…

C语言的32个基本关键字

1、数据类型关键字&#xff08;12个&#xff09; (1) char &#xff1a;声明字符型变量或函数 注&#xff1a;char 占一个字节&#xff0c;也就是 8 个二进制位&#xff0c;但它表示的是有符号的类型&#xff0c;所以表示的范围是 -128~127 &#xff1b;uchar 表示无符号的类型…

C语言的32个常用关键字

目录 前言 一、关键字是什么&#xff1f; 二、关键字使用方法 1.关键字分类 2.使用方法&#xff08;详解&#xff09; 1.数据类型关键字 int&#xff0c;float&#xff0c;double&#xff0c;charshort&#xff0c;long&#xff0c;signed&#xff0c;unsignedunion&#x…

C语言32个关键字详解

以下内容建议大家收藏&#xff0c;全是干货&#xff0c;建议反复观看&#xff01;&#xff01;&#xff01; Lets Go ! ! ! 首先我们把 C89(C90) 的所有关键字进行一下分类&#xff0c;方便大家理解。 数据类型关键字(12个)&#xff1a; char、short、int、long、signed、unsi…

android将手机能当蓝牙耳机使用吗,一种利用android手机作为蓝牙适配器的蓝牙耳机测试系统及其测试方法与流程...

本发明涉及蓝牙耳机测试的技术领域,特别涉及一种利用android手机作为蓝牙适配器的蓝牙耳机测试系统及其测试方法。 背景技术: 目前蓝牙耳机测试采用如下技术方案: 1、开发蓝牙适配器: 从耳机厂商处获取配置信息,根据配置信息开发蓝牙dongle(蓝牙适配器); 2.测试蓝牙耳机:…

手机音频口通信

1. 为什么用音频口通信而不用其他接口&#xff1f; 原因是音频口简单、廉价、每个智能手机上都有而且有大量的资料可供查阅。其他的接口诸如usb&#xff0c;firewire等&#xff0c;有的只是安卓手机上有&#xff0c;有的只是iPhone手机上有&#xff0c;即使是一般安卓手机上…

软件测试教程之手机软件测试方法

第一&#xff1a;兼容性测试&#xff08;转载来源&#xff1a;千锋&#xff09; 针对App通常会考虑这些方面&#xff1a; 1)操作系统版本 包括Andoird版本&#xff0c;iOS版本 2)屏幕分辨率 android 800*480, 960*640,1280*720(720p),1920*1080(1080p),2560*1440(2k). 对于iOS,…

手机语音通讯测试(Mobile Phone Communication Test)

手机作为个人电子设备,已然成为人们日常生活的中心,其语音通讯质量的好坏直接影响客户黏性。许多标准化组织和运营商对手机的通话质量有详细客观的定义,如中国移动,美国T-Mobile均对手机入网有严格的要求,包括手机通话的延时,及在有一定网络损耗下的语音通话质量等等。 手…

声道测试音频_AirPods Pro 空间音频的这7个问题,你都了解吗?

大家好&#xff0c;我是没能改变世界&#xff0c;却轻松被手机改变的不1不2。 真无线蓝牙耳机 AirPods Pro 空间音频的这7个问题&#xff0c;你都了解吗&#xff1f; 这篇文章的内容是AirPods Pro 空间音频的固件升级、升级故障、使用体验、空间音频和立体声的区别相关的问题&a…

一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信

一文读懂Android/iOS手机如何通过音频接口与外设通信 更多技术干货&#xff0c;欢迎扫码关注博主微信公众号&#xff1a;HowieXue&#xff0c;一起学习探讨软硬件技术知识经验&#xff0c;关注就有海量学习资料免费领哦&#xff1a; 目录 一文读懂Android/iOS手机如何通过音频接…

嵌入式学习笔记(一)嵌入式操作系统测试

嵌入式操作系统产品在学习的过程中&#xff0c;了解产品特性能够有助于学习产品功能&#xff0c;并且能够从用户角度发掘产品需要满足的重要特征&#xff0c;从而提炼产品特点&#xff0c;并且化作产品亮点&#xff0c;转化为产品未来占领市场、提升竞争力的关键切入点。 通过…

专业音响常用测试软件,音响师怎么测试音响?离不开这几款音频处理软件!

原标题:音响师怎么测试音响?离不开这几款音频处理软件! 随着计算机技术的快速发展,如今的音响圈大部分设备器材都已经开始迈入数字时代,过去用来作为现场音乐播放的CD机、硬盘机等都被现今以计算机为主体的音频工作站所代替,这样的数字变革不仅带来了音质上的提高,同时也…

linux数字音频播放器,Moode Audio Player数字音频播放系统的体验

Element14 Raspberry Pi 3B Raspberry Pi 3B ARM开发板封装 Volumio OS数字音频播放系统-主页控制主界面 上周末,我们为几台ARM微型计算机推出了Raspberry Pi [Raspberry Pi]和数字音频播放系统Volumio OS. 它可以以较低的成本和简单的安装模式将USB声卡放到消费者手中. 或者将…

如何用计算机装手机系统,教你在手机上安装Windows系统

上图是在手机上运行Windows系统时的实拍效果。回归正题,如何把电脑系统安装在手机上?01 要实现在手机上安装Windows系统,需要用到两个文件: Limbo+Windows精简镜像 其中,Limbo为后续安装的Windows系统提供了一个运行环境,它是一个手机应用软件,而Windows精简镜像则是最终…

《手机音频》参数与选择

一、手机音频&#xff1a;智能手机的音频处理电路主要处理手机的声音信号。它主要负责接收和发射音频信号&#xff0c;是实现手机音频交互的关键电路。智能手机音频处理电路主要包括&#xff1a;音频信号处理芯片&#xff08;集成ADC/DAC&#xff09;、音频功率放大器、话筒(麦…

测试音频质量的软件,音频质量PESQ得分评估原理与步骤

在实时音视频领域,我们经常需要评估音频质量。而语音质量评价是一个与语音学、语言学、信号处理、心理学、生理学等学科有密切联系的领域,因此语音质量评价是一个极其复杂的问题。语音质量评价方法从评价主体上可分为两大类:主观评价和客观评价。 主观评价:人评价(一般40人…

ap音频测试仪软件,AP APX-525音频分析仪

AP APX-525音频分析仪 AP APX-525音频分析仪 详细说明 APx525系列结合了获奖的用户介面和AP一贯的品质追求而成。APX是高速、高性能和容易使用,创新设计包括:一按测试、自动顺序执行和连续扫描技术等。只需要7秒便测量14个参数。 主功能: 高性能:THD+N典型-108DB或DB带AG52…