读书人

请看这一段简单的代码解决办法

发布时间: 2012-02-17 17:50:42 作者: rapoo

请看这一段简单的代码
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变量吗?还是编译器的问题呢?

[解决办法]
我用结构体试了一下,发现值也是一样的:

C/C++ code
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>
很明显能看出编译器的优化

读书人网 >C++

热点推荐