天天看點

棧上和堆上配置設定記憶體初始化的差別

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  
           
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)  
           

繼續閱讀