volatile用法详解(c语言)

news2024/12/27 18:48:20

前言
volatile是易变的、不稳定的意思。或许你没见过这个关键字,但它的的确确存在着。

volatile作用
保持内存可见性
volatile关键字和const 一样是一种类型修饰符,变量可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
 

#include <stdio.h>
int pass = 1;
int main()
{
	while(pass)
	{
		;
	} 	
	return 0;
}

思考一下,以上代码有哪些可优化的地方?
由于pass = 1,为真,编译器会优化此代码,将循环条件直接改为真,后续不再从内存中读取pass的值来判断循环是否停止。

汇编代码如下:
在这里插入图片描述

如果是多线程的程序,pass是有可能被其他进程改掉,循环条件应该重新判断。但是代码已被编译器优化,程序不会读取pass的值进行判断,也就不能达到想要的效果了。

volatile

#include <stdio.h>
volatile int pass = 1; //加上volatile
int main()
{
	while (pass) {
	;
	} 
	return 0;
}

汇编如下:

在这里插入图片描述

 

加了volatile后,每次都会将pass的值导入cpu判断是否循环了。

结论

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

 

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

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

相关文章

起亚中国与壳牌中国宣布战略合作协议,加速电动化品牌转型

根据相关媒体的报导&#xff0c;起亚中国和壳牌中国最近宣布了一项战略合作协议&#xff0c;旨在充分利用各自在充电基础设施方面的技术和产业资源优势&#xff0c;展开更深入的合作。 为了满足中国消费者对电动车的需求&#xff0c;起亚于今年3月发布了中国中长期电动化战略&…

Thinkphp6在线预约按摩系统H5对接杉德宝支付开发 第三方支付平台

在线预约按摩系统后端使用的是thinkphp6开发的 前端是使用uniapp开发的&#xff0c;在微信浏览器里面一打开就会自动授权登录 1、在\app\common.php底部增加一个打印测试使用的 if (!function_exists(ljLog)) {function ljLog($data, $logNameDEBUG, $fname"testlog&…

在Eclipse在Java里面调用Python脚本的方法

由于项目中需要用到Java调用Python的脚本&#xff0c;来实现一些功能&#xff0c;就对jython做了一些了解&#xff0c;通过jython可以实现java对python脚本的调用。Java调用Python开发环境配置(EclipseJythonPyDev) 1、Jython是什么 Java可以使用Jython库来调用Python库。Jyt…

Java进阶-Oracle(二十一)(2)

&#x1f33b;&#x1f33b; 目录 一、Oracle 数据库的操作(DDL DML DQL DCL TPL)1.1 标识符、关键字、函数等1.1.1 数值类型&#xff1a;1.1.2 字符串类型&#xff1a;1.1.3 日期类型1.1.4 大的数据类型--适合保存更多的数据 1.2 运算符1.3 函数---预定义函数、自定义函数&…

MFC 多语言对话框

可以直接看一下bilibili的这个本人录制的视频&#xff1a;MFC资源多语言_哔哩哔哩_bilibili 这里所说的多语言也是国际化 新建一个MFC项目&#xff0c;我这边是中文简体&#xff0c;如果想加入其他语言&#xff0c;方法如下&#xff1a; 修改完这些之后&#xff0c;需要在代码…

f1tenth仿真2

起点(0.192,0.201) 终点(9.902,5.148) 起点(9.902,5.148) 终点(-13.289,7.058) 起点(-13.289,7.058) 终点(-13.289,0.201) 起点(-13.289,0.201) #! /usr/bin/env python import time from numba import jit import math import rospy import numpy as…

python教程:删除列表中某个元素的3种方法

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python中关于删除list中的某个元素&#xff0c;一般有三种方法:remove、pop、del&#xff1a; 1.remove: 删除单个元素&#xff0c;删除首个符合条件的元素&#xff0c;按值删除 举例说明: >>> str[1,2,3,4,5,…

msvcp140.dll丢失的解决方法?三个常见修复解决方法

msvcp140.dll是Microsoft Visual C Redistributable的一部分&#xff0c;它是一个Windows操作系统中的动态链接库文件。这个文件是由Microsoft开发的&#xff0c;用于提供运行C程序所需的函数和库。它通常用于许多软件和游戏中&#xff0c;如果缺少或损坏该文件&#xff0c;可能…

【MySQL】总结中

什么是MySQL MySQL是一个数据库软件&#xff0c;是一个"客户端-服务器"结构的软件。 客户端&#xff08;Client&#xff09;&#xff1a;主动发起请求的一方。客户端给服务器发起的数据&#xff0c;称为请求&#xff08;Request&#xff09; 服务器&#xff08;Se…

【Linux】ICMP协议——网络层

ICMP协议 ICMP&#xff08;Internet Control Message Protoco&#xff09;Internet控制报文协议&#xff0c;用于在IP主机、路由器之间传递控制信息&#xff0c;是一个TCP/IP协议。该协议是用来检测网络传输的问题&#xff0c;相当于维修人员的工具。 ICMP协议的定位 在TCP/IP…

轻松转换TS视频为MP4,实现优质视频剪辑体验

如果你是一个视频剪辑爱好者&#xff0c;你一定会遇到各种视频格式之间的转换问题&#xff0c;特别是将TS视频转换为MP4格式。别担心&#xff0c;我们的视频剪辑软件将为你提供最简单、高效的解决方案&#xff01; 首先第一步&#xff0c;我们要进入媒体梦工厂主页面&#xff…

Dubbo高手之路2,6种扩展机制详解

目录 一、Dubbo扩展机制的概述二、Dubbo的自适应扩展机制1. 什么是自适应扩展机制2. 自适应扩展机制的使用示例 三、Dubbo的SPI扩展机制1. 什么是SPI扩展机制2. SPI扩展机制的使用示例3. Dubbo的SPI扩展机制中自定义扩展点的实现示例 四、Dubbo的自定义扩展点机制1. 什么是自定…

阿里云对象存储OSS预留空间详细介绍

对象存储OSS预留空间是什么&#xff1f;预留空间是指定地域的&#xff0c;仅可抵扣该地域“标准存储 - 本地冗余”的OSS存储费用&#xff0c;不支持非存储容量费用抵扣&#xff0c;付费周期一年&#xff0c;阿里云对象存储推出全新预留空间产品&#xff08;Reserved Capacity&a…

Redis 之 缓存预热 缓存雪崩 缓存击穿 缓存穿透

目录 一、缓存预热 1.1 缓存预热是什么&#xff1f; 1.2 解决方案&#xff1a; 二、缓存雪崩 2.1 缓存雪崩是什么&#xff1f;怎么发生的&#xff1f; 2.2 怎么解决 三、缓存穿透 3.1 是什么&#xff1f;怎么产生的呢&#xff1f; 3.2 解决方案 3.2.1、采用回写增强&a…

想了解一个项目完整测试流程,看这篇文章就OK了

项目的测试流程大只包含的几个阶段&#xff1a;立项、需求评审、用例评审、测试执行、测试报告文档    一、立项后测试需要拿到的文档 1、需求说明书   2、原型图&#xff08;及UI图&#xff09;   3、接口文档   4、数据库字典&#xff08;表的数量、缓存机制&#x…

第57步 深度学习图像识别:CNN可视化(Pytorch)

基于WIN10的64位系统演示 一、写在前面 由于不少模型使用的是Pytorch&#xff0c;因此这一期补上基于Pytorch实现CNN可视化的教程和代码&#xff0c;以SqueezeNet模型为例。 二、CNN可视化实战 继续使用胸片的数据集&#xff1a;肺结核病人和健康人的胸片的识别。其中&…

新版百度、百家号旋转验证码识别

昨天突然发现&#xff0c;百度旋转验证码发生了变化&#xff0c;导致使用老版本验证码训练出来的识别模型效果不佳。所有昨天花了一天时间完成了新版模型的训练。 老版本验证码 新版本验证码 新版的验证码感觉像是AI绘画随机生成的&#xff0c;还有随机阴影出现。 验证码识别…

python -m参数的作用(python3 -m)

文章目录 Python -m 参数的作用直接执行模块代码模块自测试环境隔离避免名称冲突 其他&#xff1a;python3 --help Python -m 参数的作用 在Python中&#xff0c;使用-m参数可以执行一个模块作为脚本。它是用于从命令行直接运行一个Python模块的标志。这种方式具有以下几个方面…

git远程仓库的创建及使用

1.仓库的概念&#xff1a; 1.1 本地仓库&#xff1a; 了解远程仓库前我们先了解一下本地仓库&#xff0c;本地仓库开发人员在完成部分代码的编写之后&#xff0c;可以将这一部分的代码做一个提交。这个提交完全就是一个新的版本提交&#xff0c;当然这个提交动作是在开发者的电…

QT生成Word PDF文档

需求&#xff1a;将软件处理的结果保存为一个报告文档&#xff0c;文档中包含表格、图片、文字&#xff0c;格式为word的.doc和.pdf。生成word是为了便于用户编辑。 开发环境&#xff1a;qt4.8.4vs2010 在qt的官网上对于pdf的操作介绍如下&#xff1a;http://qt-project.org/…