棧上和堆上分配記憶體初始化的區別

2021-06-19 11:39:02 字數 2503 閱讀 1136

const int nsize = 5;

棧上分配記憶體並初始化、賦值

unsigned stack_[nsize];

memset(stack_,0,sizeof(unsigned)*nsize);

for (int i = 0; i < nsize; 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的位址,

00e3142a jmp wmain+41h (0e31411h)

堆上分配記憶體並初始化、賦值

unsigned* heap_ = new unsigned[nsize];

memset(heap_,0,sizeof(unsigned)*nsize);

for (int i = 0; i < nsize; 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)

00e31479 jmp wmain+8eh (0e3145eh)

分配在堆上還是分配在棧上及其區別

1.問題情景 由c 的string的變數分配在堆上,而不是分配在棧上引起的內容回顧。注釋 c 的string型別是引用型別,不同於int,float等值型別。2.解析 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,記憶體的分配是連續的,類似於平時我們所說的棧,如果還...

C new 堆上和棧上分配物件

1 說明 new 1 一種運算子 malloc是一種c中的庫函式 2 先分配物件 operator new 再構造物件,一般用於滿足自定義的類型別 2 原型 原型 void operator new size t throw bad alloc 解釋 該函式的返回值是乙個void 指標,同時有可能會...

值初始化和預設初始化的區別

如果使用等號 初始化乙個變數,實際上執行的是拷貝初始化,編譯器把等號右側的初始值拷貝到新建立的物件中去。與之相反,如果不使用等號,則執行的是直接初始化。當初始值只有乙個時,使用直接初始化或拷貝初始化都行。如果用多個值進行初始化的情況,非要用拷貝初始化的方式處理也不是不可以,不過需要顯式地建立乙個 臨...