【C语言】volatile关键字

news2024/10/1 21:46:13

文章目录

  • 一. 基本介绍
  • 二. 演示实验
  • 三. const 能否和 volatile 一起使用

一. 基本介绍

volatile用来修饰变量,告知编译器不要对这个变量进行优化,每次要用到这个变量时都必须从内存中读取它的值。

看下面一段代码:
在这里插入图片描述

在 C/C++ 中被 const 修饰的变量已经是一个常量了,这时它具有替换的作用,编译器在编译代码的时候,在程序中看到对常量中的内容读取时,会直接使用常量中的内容替换常量。

我们可以用 volatile 修饰这个常量,告知编译器不要对这个常量进行如何优化:
在这里插入图片描述

二. 演示实验

思考一下,这个代码有哪些地方,编译器是可以优化的?

#include <stdio.h>

int pass = 1;

int main()
{

	while (pass) {
	}
	return 0;
}

编译器在编译的时候,能识别到while循环内并没有对pass变量进行修改,又因为pass变量的值就是循环条件,所以编译器会把它的值放到寄存器中,这样cpu每次要进行循环条件判定时就从寄存器中拿出值来判定,比起每次从内存中读取pass的值,从寄存器读取的速度是更快的,这是编译器在程序效率上的优化。

这种优化有些时候害了我们,比如在多线程的场景,其它线程可能就会对这个pass变量的值进行修改,这时原线程中的pass的值已然改变,但cpu依然是从寄存器中取值,造成一种内存中的值被覆盖的现象。

接下来,我们从汇编的角度,在 Linux 平台下对比演示加还是不加 volatile 的作用:

不加 volatile
在这里插入图片描述

加 volatile
在这里插入图片描述

结论:volatile 修饰变量时可以告知编译器不要对这个变量进行优化,保持变量内存的可见性

三. const 能否和 volatile 一起使用

const是常量的意思,volatile是易变的意思,这两个字义冲突的关键字能否同时使用呢?

我们各个编译器上试试看能否同时使用:

const volatile int a = 10;

上面定义变量的语句在 vs2017 和 gcc 4.8 中都能编译通过

  • const 是在编译期间起效果
  • volatile 在编译期间主要影响编译器,形成不优化的代码,进而影响运行,故:编译和运行都起效果。

const 要求你不要进行写入就可以。volatile 意思是你读取的时候,每次都要从内存读。两者并不冲突。

虽然 volatile 就叫做易变关键字,但这里仅仅是描述它修饰的变量可能会变化,要编译器注意,并不是它要求对应变量必须变化!这点要特别注意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

激活函数(Activation Function)

目录 1 激活函数的概念和作用 1.1 激活函数的概念 1.2 激活函数的作用 1.3 通俗地理解一下激活函数&#xff08;图文结合&#xff09; 1.3.1 无激活函数的神经网络 1.3.2 带激活函数的神经网络 2 神经网络梯度消失与梯度爆炸 2.1 简介梯度消失与梯度爆炸 2.2 梯度不稳…

Java基础——缓冲流

&#xff08;1&#xff09;缓冲流概述&#xff1a; 缓冲流也称高效流&#xff0c;或者高级流。&#xff08;字节流可称原始流&#xff09;作用&#xff1a;缓冲流自带缓冲区&#xff0c;可以提高原始字节流&#xff0c;字符流读写数据的性能。&#xff08;2&#xff09;字节缓…

水质站房式在线监测系统集方案要点

水质在线自动监测系统是一套高度集成的一体化水质自动监测系统&#xff0c;其中包含水样采集处理、水质自动分析、数据采集传输、远程操作监控于一体的在线全自动监控系统。 本次方案整体系统采用一体化集成方式&#xff0c;辅助设备工艺制作精细&#xff0c;同时系统工艺流程…

阿木动态 | 阿木实验室亮相第58·59届中国高等教育展(重庆)

4月10日&#xff0c;第58.59届中国高等教育博览会在重庆国际博览中心圆满结束。本届展会中&#xff0c;各大科技企业、研发机构和教育组织都集中展示了最新的教育科技成果和应用。 阿木实验室作为一家注重提高客户研发效率的企业&#xff0c;此次展会中&#xff0c;阿木实验室 …

MinIO安装配置访问以及SpringBoot整合MinIO

MinIO 1.MinIO安装 Minio 是个基于 Golang 编写的开源对象存储服务&#xff0c;存储非结构化数据&#xff0c;如&#xff1a;图片&#xff0c;视频&#xff0c;音乐等 官网地址&#xff1a;https://min.io/ 中文地址&#xff1a;http://minio.org.cn 官网文档&#xff08; …

行业首选|墨菲安全实力入选《开发安全产品及服务购买决策参考》

十分钟快速部署&#xff0c;为企业提供最高效可靠的软件供应链安全解决方案&#xff01; 近日&#xff0c;GoUpSec 深入调研了14家国内开发安全“酷厂商”&#xff08;包括专业厂商和综合安全厂商&#xff09;&#xff0c;从产品功能、应用行业、成功案例、安全策略等维度对各厂…

DAY 41 WEB和HTTP协议

HTML概述 HTML叫做超文本标记语言&#xff0c;是一种规范&#xff0c;也是一种标准&#xff0c;它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件&#xff0c;通过在文本文件中添加标记符&#xff0c;可以告诉浏览器如何显示其中的内容。 HTML命令可…

Android 纯应用的业务需求越来越窄,可否转向“智能座舱”?

回想2012年—2018年可谓是中国移动互联网的黄金时代&#xff0c;应用市场几乎每天都有新的App应用上线。 而如今却发生了巨大的改变&#xff0c;纯应用的业务需求越来越窄&#xff0c;岗位也随之收缩&#xff0c;这是作为Android开发者不容略的事实。 造成这种现象的原因是互…

类模板的三种表达方式

一:所有的类模板函数写在类的内部 template <typename T> class A { public:A(T a0) {this->a a;}T& getA() {return this->a;}A operator(const A& other) {A temp;//要求A的构造函数要有默认值temp.a this->a other.a;return temp;} private:T a;…

Java语言请求示例,电商商品详情接口,关键词搜索接口,代码封装

Java是一种编程语言&#xff0c;被特意设计用于互联网的分布式环境。Java具有类似于C语言的“形式和感觉”&#xff0c;但它要比C语言更易于使用&#xff0c;而且在编程时彻底采用了一种“以对象为导向”的方式。 使用Java编写的应用程序&#xff0c;既可以在一台单独的电脑上…

红十字救护员急救知识培训笔记

文章目录1、线上学习&#xff1a;理论知识2、线下培训&#xff1a;理论考试3、线下培训&#xff1a;实操学习实操考试3.1 心肺复苏CPR3.2 气道异物梗阻3.3 创伤救护一共有三个步骤 1、线上学习理论课程&#xff0c;所有课程进度100%可以报名线下 2、线下有一个实操的培训&#…

【实战经验】Android性能优化大分析:多种方法让你的应用飞起来

概述 Android性能优化是为了提高应用的响应速度、稳定性和用户体验。在应用开发中&#xff0c;当应用出现卡顿、卡死、运行缓慢等问题时&#xff0c;会给用户带来极差的体验&#xff0c;甚至导致用户流失。而进行性能优化可以有效地解决这些问题&#xff0c;提高应用的质量和用…

TryHackMe-Ra(windows)

Ra 您已经找到了WindCorp的内部网络及其域控制器。你能打开他们的网络吗&#xff1f; 您已经获得了WindCorp的内部网络的访问权限&#xff0c;这家价值数十亿美元的公司正在运行广泛的社交媒体活动&#xff0c;声称自己是不可破解的&#xff08;哈&#xff01;这个说法太多了…

OpenAI Translator Bob Plugin Bob上一款翻译、润色、语法修改插件

OpenAI Translator Bob Plugin 一款可以在Bob进行即时翻译的插件。它基于 OpenAI 的 GPT 系列模型&#xff0c;能够提供高质量、准确的翻译服务。该插件支持多种语言的翻译&#xff0c;包括中文、英文、法语、德语、日语等。用户只需在页面中选中需要翻译的文本&#xff0c;然…

MyBatisPlus3.4.3版自动生成代码的使用

AutoGenerator 是 MyBatis-Plus 的代码生成器&#xff0c;通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码&#xff0c;极大的提升了开发效率。 1 准备工作 创建springboot工程&#xff0c;这里省略。 2 导入依赖 <d…

Ae:灯光图层

灯光 Light是合成中可用于照亮其他 3D 图层并能产生投影、反射的一种元素&#xff0c;类似于光源。如果没有建立灯光图层&#xff0c;系统会使用默认的“环境光”来照亮场景。当建立了灯光图层之后&#xff0c;以所建立的灯光来照明。一般可根据实际需要创建一个或多个相同或不…

2023测试工程师全新技术栈,吃透这些,起薪就15k

相信每个准备软件测试面试的同学&#xff0c;不管你是大学刚毕业&#xff0c;满心憧憬着进入公司实习、非计算机行业转行软件测试、自学测试就业还是培训后就业&#xff0c;都会面临着众多的疑问和不解&#xff0c;那就是该怎么走出着第一步&#xff0c;今天本文一次性告诉你&a…

第三章 运算符

文章目录1. 什么是运算符2 算术运算符2.1 基本四则运算符 、-、*、/、%2.2 增量赋值运算符 、- 、* 、/ 、%2.3 自增/自减运算符 、--3. 关系运算符4. 逻辑运算符5. 位运算符6. 移位运算7. 条件运算符8. 运算符的优先级1. 什么是运算符 计算机的最基本的用途之一就是执行数学运…

蓝桥杯web组备赛

文章目录前言js的数据结构和算法find方法箭头函数注意事项vue2的问题学会用检查来快速查看代码结构css Transform原生dom操作有些遗忘当看不懂js逻辑的时候console.log打印看一下jquery的使用vue2也忘了&#xff0c;一个月没写就忘成狗class 和 style的动态绑定axios获取数据购…

FFMpeg的整体结构

fdk-aac voaac_enc x264这些属于扩展。需要另外编译。 FFMPEG有8个常用库&#xff1a; AVUtil: 核心工具库&#xff0c;下面的许多其他模块都会依赖该库做一些基本的音视频处理操作。 AVFormat&#xff1a;文件格式和协议库&#xff0c;该模块是最重要的模块之一&#xf…