C语言学习之volatile

目录

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

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

忆梦初心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值