刚学习了下const和const_cast,在汇编中看到,声明const变量,栈空间被开拓,然而在用这个变量的时候,所有用到它的地方都会被它的值替换,所以无法对其进行修改。
在下面这个例子中,当用const_cast消除const属性时,指针被赋予了const变量的地址,于是可以修改这个地址的值,所以在调试状态下看到原变量的值会变,但用到原变量的地方由于使用的是编译时赋予的值,所以不会发生变化,由此看来,const_cast只是做了一个取地址的工作
例子:
int main(int argc, char* argv[])
{
const int i1 = 0;
int *i2 = const_cast<int*>(&i1);
*i2 = 3; // 调试时看到i1=3
printf("i1 =%d/ni2 =%d/n", i1, *i2); //输出时i1 =0,因为在编译时就已经发生了常量替换
printf("i1 address=%d/ni2 address=%d/n", &i1, i2); // i2保存的是i1的地址
return 0;
}
这段汇编证明发生了替换:
8: const int i1 = 0;
0040D718 mov dword ptr [ebp-4],0
9: int i3 = i1;
0040D71F mov dword ptr [ebp-8],0
10: int i4 = i3;
0040D726 mov eax,dword ptr [ebp-8]
0040D729 mov dword ptr [ebp-0Ch],eax
所以,我们可以用下面的方法同样获得i1的地址
int main(int argc, char* argv[])
{
const int i1 = 0;
int p = (int)((int *)&i1 - 1);
int *i2 = (int *)p + 1;//const_cast<int*>(&i1);
*i2 = 3;
printf("i1 =%d/ni2 =%d/n", i1, *i2);
printf("i1 address=%d/ni2 address=%d/n", &i1, i2);
return 0;
}