C语言学习之volatile

volatile是C语言中的一个关键字,用于修饰易变的变量,防止编译器优化。它确保每次读取变量时都从内存中获取,适合在多线程环境或受外部影响的变量使用。文章通过示例解释了volatile的作用,以及与const关键字的区别,并讨论了volatile修饰指针的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.volatile的理解

2.volatile的作用

        1.寄存器与内存

        2.volatile的作用

        3.总结

3.几个小问题

        1.问题一

        2.问题二

        3.问题三


1.volatile的理解

        volatile作为C语言的32个关键字的其中一个,目前我们可能从未在代码中进行使用过。是因为它没有实际应用场景吗?并不是。volatile是一个特征修饰符,它是用来修饰易变的变量,告诉编译器每次需要读取这个变量时要到内存中去读取

2.volatile的作用

        1.寄存器与内存

        首先我们要清楚,我们定义的变量都是在主存中(register除外),而每当我们需要对主存中数据进行操作时,CPU都需要先进行内存访问,然后将内存中的数据读取拷贝到寄存器中,最后在寄存器中对数据进行操作。CPU对各类存储器的访问速度如下:

CPU访问速度从上到下呈递减规律;硬件存储容量从下到上呈递增规律


         2.volatile的作用

        我们通过下面一段代码来分析其作用:

#include<stdio.h>
int main()
{
	//int flag = 1;             //不加flag修饰
	volatile int flag = 1;   //volatile修饰
	while (flag)
	{
		;
	}
	return 0;
}

         如上,我们写了一个死循环,而循程序其他地方没有对flag进行任何修改。这时,编译器就有很大概率会对代码进行优化,将flag变量缓存至寄存器中,使得CPU不在访问主存单元,直接对寄存器中的数据进行操作,提升CPU运行的速度。

        但是,如果由于某种外部因素使的flag所在内存单元被修改了呢?如多线程中断等情况。此时由于CPU没有不会访问内存更新数据,依旧会使用在寄存器保存的旧值,导致出错,显然我们不希望看到这种情况。这时我们就可以使用volatile,volatile关键字告诉编译器这个变量可能在某些情况会发生修改,使得编译器不进行优化,CPU每次使用这个变量需要重新读取内存


         3.总结

volatile被称作易变关键字,作用是告诉编译器这个变量可能被修改,需要每次都从内存中访问这个变量,达到稳定访问内存

3.几个小问题

        1.问题一

        问:既然volatile是易变关键字,而const修饰变量代表变量的内容不能被修改,那么二者能不能一起使用,会不会冲突呢?

        答:可以一起使用,const要求你不要进行修改写入即可,而volatile意思是你读取数据的时候每次都要从内存中读取,两者并不冲突,作用的地方不同。


        2.问题二

        问:volatile可以用来修饰指针吗?

        答:可以。volatile修饰指针表示指针指向空间的数据是易变的,编译器每次都需要访问内存。


         3.问题三

        问:以下函数能否实现计算一个整数的平方的功能?

int Squa(volatile int* &ptr)       //声明为引用使外部可能更改
{
	int a = 0;
	int b = 0;
	a = *ptr;
	b = *ptr;
	return a*b;
}

        答:可能无法实现。volatile修饰*ptr,因此代表ptr指向空间的数据是易变的,需要访问内存。因此前后两次解引用后所得数据可能不同。正确的写法应该是:

int Squa(volatile int* &ptr)       //声明为引用使外部可能更改
{
	int a = 0;
	a = *ptr;
	return a*a;
}

以上,就是本期的全部内容。

制作不易,能否点个赞再走呢qwq

C语言中的volatile关键字是用来声明一个变量为“易变”的。这意味着该变量的值可以在程序执行期间随时发生变化,可能由于硬件或者其他并行执行的线程的影响。使用volatile关键字可以告诉编译器不要对该变量进行优化,以确保每次访问该变量时都从内存中读取最新的值。这对于需要频繁读写硬件寄存器或者在多线程环境下共享的变量非常有用。 参考资料: C语言深度解析专栏—C语言关键字详解第五篇 C语言学习 -- 关键字volatile_聚优致成的博客-CSDN博客 更多关键字在下面博客链接 C语言关键字详解(一)auto、register关键字 C语言关键字详解(二)带你全面了解 static C语言关键字详解(三)数据类型与sizeof关键字 C语言关键字详解(四)带你全面了解 const 关键字<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C语言关键字详解(五)带你全面了解 volatile 关键字](https://blog.csdn.net/m0_62391199/article/details/123746218)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C语言volatile 关键字](https://blog.csdn.net/qq_58264156/article/details/127416196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆梦初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值