const类型强制转换之谜

  使用C++的各位想必对const都不陌生,在C++中这是个好用的关键字,但是平时使用时却存在一定误区,尤其是当你需要对它强制转型时。

#include<iostream>
int main(){
	using namespace std;
	const int num_a = 9;
	int& p_num_a = const_cast<int&>(num_a);
	p_num_a=1;
	cout << p_num_a << " " << num_a << endl;
	cout << &p_num_a << " " << &num_a << endl;
	
	int num = 9;
	const int num_b = num;
	int& p_num_b = const_cast<int&>(num_b);
	p_num_b = 1;
	cout << p_num_b << " " << num_b << endl;
	cout << &p_num_b << " " << &num_b << endl;	
	return 0;
}

  猜一下答案是什么?

  不知道各位是否有过类似的情况,其实第一种情况相当容易理解,因为C++中的const是常量,而不是C中定义的“值不变的变量”,也就是说C++中的const是没有内存空间的,仅仅是当作字面量处理了,是不是很像define?

  但是为什么会出现第二种情况?让我们先来看一段GAS汇编码。

  对比很容易发现多出了

movl $9 , 24(%esp)              ; num=9

movl 24(%esp) , %eax          ; eax=num

movl %eax , 12(%esp)          ; num_b=num

  可知此时的const由于上述代码,不能再将自己放进符号表,不再具备像define一样的特性,这样就具有了存储空间,因此我们对他修改的值,都在num_b中有直观反映。

  因为C++里的const是内部链接的,所以如果我们使用extern const int num_b也能达到相同的效果。

  有一点需要补充,C里的const也可能出现像C++一样的情况,这个是编译器优化造成的,所以只需要把优化级别降低就行了。

转载于:https://my.oschina.net/codesun/blog/82986

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值