首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-02-17 
请看这一段简单的代码void main(){const int a10int& bconst_castint &(a)b5couta &aen

请看这一段简单的代码
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>
很明显能看出编译器的优化

热点排行