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

原创 2013年12月01日 22:42:48

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)  



new分配内存栈堆静态区的区别

#include #include using namespace std; //char str[1024] = { 0 }; //内存静态区 //静态区,栈区,堆区 //int *p2 = ...

10、C++在堆上分配内存

在堆上分配内存 基本语法1: 类型标识符 *指针变量名 =new 类型标识符(初值); 也可以为一个指针分配一个数组大小内存,并将首地址赋值给指针变量。 语法2: 类型标识符 *指针变量名=...

JNI: Get/ReleaseStringUTFChars和Get/ReleaseIntArrayElements的区别,isCopy是否重新分配内存的问题

/** * example-01: GetStringUTFChars() * * 代码出自《The Java Native Interface Programmer’s Guide and S...

静态分配和动态分配内存的区别

 要弄懂这个问题,首先你得知道静态和动态指的是什么。个人觉得卡耐基上的解释很经典:      “The word static refers to things that happen at ...

C和C++中动态分配内存的区别

c是malloc和free, c++是new和delete,(C++面向对象的) 区别如下: (1)new、delete 是操作符,可以重载,只能在C++中使用。 (2)mal...

new 和malloc 给变量分配内存的区别

转载自:http://blog.163.com/yangjun1988422@126/blog/static/4741291720084305615602/ 1、new 是c++中的...

C语言:动态分配内存,malloc()与realloc()区别

C语言:动态分配内存,malloc()与realloc()区别
  • xyphf
  • xyphf
  • 2017年07月24日 14:44
  • 176

静态分配和动态分配内存的区别

要弄懂这个问题,首先你得知道静态和动态指的是什么。个人觉得卡耐基上的解释很经典:     “The word static refers to things that happen at compil...
  • passball
  • passball
  • 2011年02月23日 20:22
  • 12897

静态分配和动态分配内存的区别

要弄懂这个问题,首先你得知道静态和动态指的是什么。个人觉得卡耐基上的解释很经典:      “The word static refers to things that happen at co...

程序内存分配知识(分配在堆上还是栈上整不明白的看看)

一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:栈上和堆上分配内存初始化的区别
举报原因:
原因补充:

(最多只允许输入30个字)