常量折叠

 

 

/* 看下面这句的反汇编代码

cout << a << ", " << *p << endl;

00B11547 mov         esi,esp

00B11549 mov         eax,dword ptr [__imp_std::endl (0B1A340h)]

00B1154E push        eax

00B1154F mov         edi,esp

00B11551 mov         ecx,dword ptr [p]

00B11554 mov         edx,dword ptr [ecx]

00B11556 push        edx

00B11557 push        offset string ", " (0B17800h)

00B1155C mov         ebx,esp

00B1155E push        1 // 关键看这一句,注意到输出打印a的值的时候传进去的并不是a

// 这个到底是哪来的,就是从我们的常量表里来的。

00B11560 mov         ecx,dword ptr [__imp_std::cout (0B1A344h)]

00B11566 call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0B1A32Ch)]

00B1156C cmp         ebx,esp

00B1156E call        @ILT+420(__RTC_CheckEsp) (0B111A9h)

00B11573 push        eax

00B11574 call        std::operator<<<std::char_traits<char> > (0B11159h)

00B11579 add         esp,8

00B1157C mov         ecx,eax

00B1157E call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0B1A32Ch)]

00B11584 cmp         edi,esp

00B11586 call        @ILT+420(__RTC_CheckEsp) (0B111A9h)

00B1158B mov         ecx,eax

00B1158D call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0B1A34Ch)]

00B11593 cmp         esi,esp

00B11595 call        @ILT+420(__RTC_CheckEsp) (0B111A9h)

 

 

总结:编译器会为常量分配了地址,但是在使用常量的时,常量会被一立即数替换(保护常量,防止被破坏性修改)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值