volatile用法详解(c语言)

前言

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

volatile作用

保持内存可见性

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

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

思考一下,以上代码有哪些可优化的地方?

由于pass = 1,为真,编译器会优化此代码,将循环条件直接改为真,后续不再从内存中读取pass的值来判断循环是否停止。

汇编代码如下:

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

volatile

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

汇编如下:

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

结论

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

相关推荐
richxu20251001几秒前
嵌入式学习之路>(二)单片机核心原理篇>1.GPIO
单片机·嵌入式硬件·学习
恒锐丰小吕3 分钟前
无锡黑锋 HF6213 高PSRR、低噪声射频LDO稳压器技术解析
嵌入式硬件·硬件工程
繁华似锦respect4 分钟前
C++ 设计模式之观察者模式详细介绍
linux·开发语言·c++·windows·观察者模式·设计模式·visual studio
做cv的小昊7 分钟前
在NanoPC-T6开发板上通过USB串口通信实现光源控制功能
java·后端·嵌入式硬件·边缘计算·安卓·信息与通信·开发
froginwe1114 分钟前
CSS Text(文本)详解
开发语言
繁华似锦respect16 分钟前
C++ 自定义 String 类
服务器·开发语言·c++·哈希算法·visual studio
n***44318 分钟前
Java进阶:IO大全
java·开发语言·python
jtymyxmz20 分钟前
《JavaEE企业级应用开发教程(Spring+Spring MVC+Mybatis)》3.2 动态代理
java·开发语言
喵霓24 分钟前
mac系统的环境变量-bash_profile
开发语言·macos·bash
三佛科技-1341638421226 分钟前
FT8433-LRT/FT8433-KRT低成本5V80MA非隔离电源方案 BUCK/BUCK-BOOST典型电路
单片机·嵌入式硬件·智能家居·pcb工艺