Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1378193
  • 博文数量: 370
  • 博客积分: 10654
  • 博客等级: 中将
  • 技术积分: 4396
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 15:44
文章分类

全部博文(370)

文章存档

2012年(36)

2011年(195)

2010年(139)

分类: C/C++

2010-11-12 19:53:32

  c++里的常量折叠(或者常量替换)是将const常量放在符号表中,而并不给其分配内存。编译器直接进行替换优化。


#include
using namespace std;

int main(void)
{
  const int a=10;
  int * p = (int*)&a;//为了能尝试通过*p修改常量a的值,用了强制转换

  cout<<"a = "<< a<   cout<<"*p= "<<*p<   *p=100; //试图修改a的值
  cout<<"a = "<< a<   cout<<"*p= "<<*p<
  system("pause");
}



以下是 cout<<"a = "<< a<这一句在DEBUG时的汇编代码:
004114DB mov esi,esp 
004114DD mov eax,dword ptr [__imp_std::endl (41A344h)] 
004114E2 push eax  
004114E3 mov edi,esp 
004114E5 push 0Ah ;;;;;;;注意这里是个10,是个立即数
004114E7 push offset string "*p=" (417704h) 
004114EC mov ecx,dword ptr [__imp_std::cout (41A348h)] 
004114F2 push ecx  
004114F3 call std::operator<< > (411159h) 
004114F8 add esp,8 
004114FB mov ecx,eax 
004114FD call dword ptr [__imp_std::basic_ostream >::operator<< (41A34Ch)] 
00411503 cmp edi,esp 
00411505 call @ILT+410(__RTC_CheckEsp) (41119Fh) 
0041150A mov ecx,eax 
0041150C call dword ptr [__imp_std::basic_ostream >::operator<< (41A32Ch)] 
00411512 cmp esi,esp 
00411514 call @ILT+410(__RTC_CheckEsp) (41119Fh) 

阅读(1194) | 评论(1) | 转发(0) |
0

上一篇:Linux内核中断的内幕

下一篇:get()函数

给主人留下些什么吧!~~

chinaunix网友2010-11-15 15:22:47

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com