CPP里 const修饰栈变量的奇怪事情

今天在看面经的时候无意间看到了const修饰栈变量的一些奇奇怪怪的事情,先来看一段代码

int main()
{
	int a = 1;
	int* pa = (int*)&a;
	*pa = 2;
	cout << "a = " << a << '\n';

	return 0;
}

运行截图:
在这里插入图片描述
没有任何问题 pa指向a,通过pa可以修改a

再看一段:

int main()
{
	const int a = 1; // 这里加了const修饰a
	int* pa = (int*)&a;
	*pa = 2;
	cout << "a = " << a << '\n';

	return 0;
}

这段代码与第一段代码区别不大,只是a被const修饰了,直接通过int*是不能指向const int* 的,所以这里强转一下,按常理说应该可以修改a的值,但我们看一下运行结果
在这里插入图片描述
a = 1?
别着急,我们再看一段代码

int main()
{
	volatile const int a = 1; // 用volatile修饰const int
	int* pa = (int*)&a;
	*pa = 2;
	cout << "a = " << a << '\n';

	return 0;
}

这里用了volatile和const一起修饰a,运行结果:
在这里插入图片描述

可以发现a被成功改变了。
什么原因导致的呢?

初步理解可能是编译器对const修饰的栈变量进行了优化,比如直接将它的值直接内联到代码中,不为其分配实际的地址。

当加入了volatile修饰之后,不让编译器对const修饰的栈变量进行优化时,这样我们每次访问这个a都是从内存中存取,通过int* pa确实可以实际修改指向地址处的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值