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;
}

  猜一下答案是什么?

const类型强制转换之谜

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

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

const类型强制转换之谜

  对比很容易发现多出了

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++一样的情况,这个是编译器优化造成的,所以只需要把优化级别降低就行了。

你可能感兴趣的:(C++,Const,gas)