请看这一段简单的代码
void main()
{
const int a=10;
int& b=const_cast<int &>(a);
b=5;
cout<<a<<" "<<&a<<endl;
cout<<b<<" "<<&b<<endl;
}
环境VC6,结果:
a和b打印出来的值分别是10和5,但是打印出来的地址又一样。
请问:
为什么地址一样而值不一样呢?能通过这种方式修改const变量吗?还是编译器的问题呢?
[解决办法]
我用结构体试了一下,发现值也是一样的:
struct SS{ int a; SS(int inV){a = inV;} SS& operator=(const SS& inSS) { a = inSS.a; return *this; }};int _tmain(int argc, _TCHAR* argv[]){ const SS a(10); SS& b=const_cast<SS&>(a); b.a = 5; //fine //a.a = 4; //you cannot assign to a variable that is const cout <<a.a<<" " <<&a <<endl; cout <<b.a<<" " <<&b <<endl; system("pause"); return 0;}
[解决办法]
一个是编译器直接用常量代替了,一个是从内存中获取值
丫的!C++代码转换成汇编以后的代码看起来有点痛苦。
用C调用printf函数的话,要么都优化掉,要么都不优化:
08048368 <main>:
8048368: 55 push %ebp
8048369: 89 e5 mov %esp,%ebp
804836b: 83 ec 08 sub $0x8,%esp
804836e: 83 e4 f0 and $0xfffffff0,%esp
8048371: 83 ec 14 sub $0x14,%esp
8048374: 6a 05 push $0x5 // 编译器直接压入两个值
8048376: 6a 0a push $0xa
8048378: 68 68 84 04 08 push $0x8048468
804837d: e8 2e ff ff ff call 80482b0 <printf@plt>
8048382: 31 c0 xor %eax,%eax
8048384: c9 leave
8048385: c3 ret
8048386: 90 nop
8048387: 90 nop
但是C++代码转换成汇编以后虽然很长但是压栈有明显差别(Linux环境):
8048884: 6a 0a push $0xa // 直接压常量
8048886: 68 b8 9c 04 08 push $0x8049cb8
804888b: e8 54 fd ff ff call 80485e4 <_ZNSolsEi@plt>
……
80488ca: ff 30 pushl (%eax) // 压入栈中的值
80488cc: 68 b8 9c 04 08 push $0x8049cb8
80488d1: e8 0e fd ff ff call 80485e4 <_ZNSolsEi@plt>
很明显能看出编译器的优化