const_cast 如何实现的

在c++里面,类型之间的转换是要检查的,但是指针之间的类型的转换并不检查原来的类型,例如下面的代码:(const_cast实现的原理)

int main()
{
	const  int constant = 21;
	int* modifier = (int*)(&constant);
	*modifier = 22;
	cout<<constant<<endl;
	cout<< *modifier <<endl;
	cout<< modifier << " " << &constant <<endl;
}

是可以编译通过的,但是发现,这两个值得地址是一样的,但是里面的内容欧冠不一样,虽然是用了-O0禁止编译器优化,但是,编译器还是给优化了,然后我们加上volatile关键字:

int main()
{
	const  volatile int constant = 21;
	int* modifier = (int*)(&constant);
	*modifier = 22;
	cout<<constant<<endl;
	cout<< *modifier <<endl;
	cout<< modifier << " " << &constant <<endl;
}

发现值还是21和22,也就是说,编译器还是给忽略了(凉风2级,心里爽歪歪)。但是有的编译器是会很乖地改变,比如vs2000。

还有一点,const 修饰的全局变量存在于rodata 区,也就是符号表区域,对其向上面的代码对它进行修改是会segmentfault的。

const修饰的局部变量是存放在栈上面的。


参考:http://blog.chinaunix.net/uid-17283404-id-5260150.html

http://blog.youkuaiyun.com/zz460833359/article/details/48917217

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值