在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