关闭

栈上和堆上分配内存初始化的区别

378人阅读 评论(0) 收藏 举报
分类:

const int NSIZE = 5;

栈上分配内存并初始化、赋值

unsigned stack_[NSIZE];
	memset(stack_,0,sizeof(unsigned)*NSIZE);
	for (int i = 0; i < NSIZE; i++)
	{
		stack_[i] = i;
	}

汇编:

unsigned stack_[NSIZE];
	memset(stack_,0,sizeof(unsigned)*NSIZE);
00E313F8  push        14h  
00E313FA  push        0  
00E313FC  lea         eax,[stack_]  
00E313FF  push        eax  
00E31400  call        _memset (0E31078h)  
00E31405  add         esp,0Ch  
//首先压入20、0、stack_地址,然后调用_memset初始化,最后esp指针回到压栈地址。
	for (int i = 0; i < NSIZE; i++)
00E31408  mov         dword ptr [ebp-28h],0  
00E3140F  jmp         wmain+4Ah (0E3141Ah)  
00E31411  mov         eax,dword ptr [ebp-28h]  
00E31414  add         eax,1  
00E31417  mov         dword ptr [ebp-28h],eax  
00E3141A  cmp         dword ptr [ebp-28h],5  
00E3141E  jge         wmain+5Ch (0E3142Ch)  
//[ebp-28h为i的地址,

	{
		stack_[i] = i;
00E31420  mov         eax,dword ptr [ebp-28h]  
00E31423  mov         ecx,dword ptr [ebp-28h]  
00E31426  mov         dword ptr stack_[eax*4],ecx  
	}
00E3142A  jmp         wmain+41h (0E31411h)  

堆上分配内存并初始化、赋值

	unsigned* heap_ = new unsigned[NSIZE];
	memset(heap_,0,sizeof(unsigned)*NSIZE);
	for (int i = 0; i < NSIZE; i++)
	{
		heap_[i] = i;
	}

反汇编:

	unsigned* heap_ = new unsigned[NSIZE];
00E3142C  push        14h  
00E3142E  call        operator new (0E31190h)  
00E31433  add         esp,4  
00E31436  mov         dword ptr [ebp-10Ch],eax  
00E3143C  mov         eax,dword ptr [ebp-10Ch]  
00E31442  mov         dword ptr [heap_],eax  
	memset(heap_,0,sizeof(unsigned)*NSIZE);
00E31445  push        14h  
00E31447  push        0  
00E31449  mov         eax,dword ptr [heap_]  
00E3144C  push        eax  
	memset(heap_,0,sizeof(unsigned)*NSIZE);
00E3144D  call        _memset (0E31078h)  
00E31452  add         esp,0Ch  
	for (int i = 0; i < NSIZE; i++)
00E31455  mov         dword ptr [ebp-40h],0  
00E3145C  jmp         wmain+97h (0E31467h)  
00E3145E  mov         eax,dword ptr [ebp-40h]  
00E31461  add         eax,1  
00E31464  mov         dword ptr [ebp-40h],eax  
00E31467  cmp         dword ptr [ebp-40h],5  
00E3146B  jge         wmain+0ABh (0E3147Bh)  
	{
		heap_[i] = i;
00E3146D  mov         eax,dword ptr [ebp-40h]  
00E31470  mov         ecx,dword ptr [heap_]  
00E31473  mov         edx,dword ptr [ebp-40h]  
00E31476  mov         dword ptr [ecx+eax*4],edx  
	}
00E31479  jmp         wmain+8Eh (0E3145Eh)  



0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:21648次
    • 积分:417
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:7篇
    • 译文:3篇
    • 评论:2条
    最新评论