記憶體四區 堆和棧的區別

2021-08-14 23:47:58 字數 1053 閱讀 9530

記憶體四區

乙個c/c++程式所占用的系統記憶體共分為4個部分

1、棧區(也叫堆疊,stack):存放所有的區域性

變數,函式

形參,由系統進行自動完成。棧的大小:在linux中為8兆, 在windows中為2兆。

2、堆區(heap):由程式設計師自己管理的,在程式執行過程中進行動態分配的記憶體。你可以用malloc()系列函式進行動態的新增和釋放。堆的大小並不是固定的,可以動態的擴張或者收縮。

3、資料區:資料區中分兩個部分

第一部分—未初始化的資料段(bss):存放全域性和靜態(全域性靜態、區域性靜態)的未初始化的變數

第二部分—資料段(data) :存放程式中明確被初始化的全域性變數和靜態變數(包括全域性靜態變數和區域性靜態變數)

4、**段(text):存放所有可執行**(包括程式指令、常量字串等)都載入到**區。這塊內存在程式執行期間不變。

棧和堆的區別

以下從6個方面來比較兩者

1、增長方向:棧:從上往下

堆:從下往上

2、管理方式:棧:編譯器自動管理,無需程式設計師控制

堆:堆空間的申請和釋放工作由程式設計師控制,但容易出現記憶體洩漏。

3、是否產生碎片:棧由系統操作控制不產生碎片

堆:由於頻繁的malloc/free,造成記憶體空間的不連續,造成大量的碎片空間,程式效率低。

4、分配方式:棧:由編譯器完成分配釋放,棧的動態分配由alloca()函式完成,由編譯器申請和釋放。

堆:利用malloc()系列函式動態申請分配,由free()函式釋放。

5、空間大小: 棧:很小。

堆:比棧要大的多。

6、分配效率:棧:很高:計算機會在底層對棧提供支援,分配專門的暫存器存放棧的位址。壓棧、出棧都有專門的指令執行。

堆:比棧低的多:為了分配一塊記憶體,庫函式會按演算法在堆內搜尋可用的足夠大的空間,沒有的情況下需要作業系統來重新整理記憶體空間。

記憶體四區中堆區見解

堆區 由程式設計師分配釋放 若程式設計師不釋放,則在程式結束後自動釋放。堆區就像定義一樣,由程式設計師自己分配,這裡我們使用malloc函式來分配空間 include include include char getmem int num char p null p char malloc size...

記憶體四區之堆疊區別

一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它...

記憶體中堆區和棧區的區別

從下面五個方面說一下記憶體中堆和棧的區別 1 管理方式 對於棧來講,是由編譯器自動管理,無需我們手工控制 對於堆來說,釋放工作由程式設計師控制,容易產生memory leak。2 申請大小 能從棧獲得的空間較小,堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。堆的大小受限於計算機系統中有效的虛...