详解volatile关键字

volatile字面意思:易变的。在计算机里,是防止优化的意思,然而是怎么防止优化的呢?待我一一道来哦。微笑微笑

先看这样一个例子:

<span style="font-size:18px;">#include<iostream>
using namespace std;
int main()
{
	int num = 10;
	int *p = &num;
	*p = 20;
	cout<<num<<endl;
	getchar();
	return 0;
}</span>
结果是什么呢?


由于p取得是num的地址,即p指向num,然后*p即取出p指向的内容,将它修改为20,所以结果输出num也被修改为20.

我们再看一个例子:

<span style="font-size:18px;">#include<iostream>
using namespace std;
int main()
{
	const int num = 10;
	int *p = (int*)#
	*p = 20;
	cout<<num<<endl;
	getchar();
	return 0;
}</span>
这里只是在int前加了const,将num设定为常量(在c语言中加const修饰变量叫常变量,c++中const修饰变量叫常量),所以无法修改num的值,结果如下:


这里我详细说明一下它是怎么执行的?调出内存看一下吧:


这是num所在的位置。赋值为10.


此时p就指向num。

内存里边p指向的内容确实改变了。但是我们看一下输出的结果:(如果在linux下演示的话,将代码编到test.c下,用命令gcc test.c -02 使优化级别最高进行测试)


为什么输出的结果却是10呢?p所指向的内容确实是num,但是在这里*p改变了,num却不受影响。。这个原因就在于const关键字。const将num这个变量修饰为常量,所以无法修改它,为了使常量不受破坏,就把它放在了寄存器中。以方便使用。又因为寄存器是不编址的,所以取地址根本不受影响。说起寄存器,看一下下面这幅图:(画的不错,网上抠下来的哈)


显而易见,最上边的是寄存器,是速度最快的,最下边是内存,是速度最慢的。那么问题来了,既然寄存器这么快,为什么不把变量都放在寄存器里呢。首先,学过计算机组成原理的同学都知道,寄存器造价高,空间小,可经不起那样的伤害。所以我们尽可能的把它们放在内存中,内存的空间大小可比寄存器的大多了。

为了解决上面的问题,我们引来了另一个关键字:volatile

volatile是这样使用的。

#include<iostream>
using namespace std;
int main()
{
	volatile const int num = 10;
	int *p = (int*)#
	*p = 20;
	cout<<num<<endl;
	getchar();
	return 0;
}
这样,volatile会防止编译器的优化,保证内存的可见性。也就是不将num放入寄存器,而是放在内存中,这样就可以找到它的地址,进而修改它了。

结果是:



以上就是volatile的简单介绍,希望能对大家的认识有所帮助哦,欢迎来访~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值