程式及其執行時記憶體分配解析

2021-09-30 08:09:40 字數 1078 閱讀 3325

乙個c/c++程式占用的記憶體可分為以下5種:

2. 堆區:一般由程式設計師分配和釋放,此堆和資料結構堆完全是兩回事,此堆的分配釋放方式類似於鍊錶。執行時操作。

3. 全域性/靜態區:全域性變數和靜態變數存放於此。而初始化和非初始化的全域性/靜態變數又放在不同的兩塊。程式結束由系統釋放。

4. 文字常量區:常量字串放在此處。程式結束由系統釋放。

5. 程式**區:存放函式體的二進位制**。

堆和棧的比較:

1. 申請方式

棧有系統自動操作完成,由高位址向地位址操作。

堆由程式設計師操作完成。

2. 大小控制

棧的大小依賴於系統(但是可以便以前修改)。

堆由程式設計師指定。

3. 系統響應

對於棧,如果申請大小超出棧區剩餘空間,則報出棧區溢位異常。

對於堆,系統先順向查詢第乙個空間大於申請空間的堆節點,然後刪除申請的部分,將剩餘部分重新接上,類似鍊錶操作。

4. 申請效率

棧由系統操作,速度較快,但程式設計師無法控制,不靈活。

堆有程式設計師使用關鍵字操作,比較慢,但程式設計師可以控制,使用靈活。

5. 訪問效率

char stack="12345";

char *heap="67890";

"12345"是在執行時進行賦值操作的,"67890"是在編譯時進行的。

但是,以後的訪問速度上,前者要快於後者,因為後者多一次讀取操作。

51:       char cs=stack[0];//對應的彙編**兩次move操作

0040114d   mov         dl,byte ptr [ebp-14h]

00401150   mov         byte ptr [ebp-1ch],dl

52:       char ch=heap[0];//對應的彙編**三次move操作

00401153   mov         eax,dword ptr [ebp-18h]

00401156   mov         cl,byte ptr [eax]

00401158   mov         byte ptr [ebp-20h],cl

程式執行時的記憶體分配

一 在程式執行期間,變數儲存空間有三種 1 靜態儲存區。內存在程式編譯的時候就已經分配好了,這塊內存在程式執行期間都存在,儲存全域性變數和靜態變數。2 棧儲存區。記憶體是在程式執行期間才分配的,函式內區域性變數及函式引數的儲存單元,當 函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理...

c 程式執行時的記憶體分配

c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。1 棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。2 堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個del...

程式編譯後執行時的記憶體分配

參考文章之編譯 執行 參考文章之執行程式時的記憶體分配方式 bss段 參考文章之程式執行時的記憶體分配 參考文章之堆 棧 1.程式編譯時的記憶體狀況 編譯時不分配記憶體。編譯器能夠識別語法,資料型別等 然後逐行逐句檢查編譯成資料的.obj檔案 然後再由連線程式將其連線成乙個exe檔案 此時的程式以e...