C C Linux記憶體分段區別

2021-10-07 01:26:21 字數 1598 閱讀 5729

一、c語言記憶體分段區域

內容棧區域性變數、函式引數、函式返回值

堆malloc/free

全域性/靜態儲存區

初始化和未初始化的全域性變數和靜態變數、是否初始化分開存放

常量儲存區

常量二、c++記憶體分段區域

內容棧區域性變數、函式引數、函式返回值

堆malloc/free

自由儲存區

new/delete

全域性/靜態儲存區

初始化和未初始化的全域性變數和靜態變數

常量儲存區

常量

c++的堆是沿用c語言的堆的說法。基本上,所有的c++編譯器預設使用堆來實現自由儲存,運算子new和delete內部預設是使用malloc和free的方式來被實現,這時藉由new運算子分配的物件,說它在堆上也對,說它在自由儲存區上也正確。

三、linux程序記憶體分段區域

內容棧區域性變數、函式引數、函式返回值

堆new/delete、malloc/free

bss段

未初始化全域性變數(預設0初始化)

data段

初始化的全域性變數、靜態變數、常量資料

**段程式執行**

四、堆和棧的區別

主要的區別由以下幾點:

(1)*管理方式:*堆中資源由程式設計師控制(通過malloc/free、new/delete,容易產生memory leak),棧資源由編譯器自動管理。

(2)*系統響應:*對於堆,系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式申請時,遍歷該鍊錶,尋找第乙個大於所申請空間的空間的堆結點,刪除空閒結點鍊錶中的該結點,並將該結點空間分配給程式(大多數系統會在這塊記憶體空間首位址記錄本次分配的大小,這樣delete才能正確釋放本記憶體空間,另外,系統會將多餘的部分重新放入空閒鍊錶中)。對於棧,只要棧的剩餘空間大於所申請空間,系統就會為程式分配記憶體,否則報異常出現棧空間溢位錯誤。

(3)*空間大小:*堆是不連續的記憶體區域(因為系統是用鍊錶來儲存空閒記憶體位址的,自然不是連續),堆的大小受限於計算機系統中有效的虛擬記憶體(32位機器上理論上是4g大小),所以堆的空間比較靈活,比較大。棧是一塊連續的記憶體區域,大小是作業系統預定好的,windows下棧大小是2m(也有是1m,在編譯時確定,vc中可設定)。

(4)*碎片問題:*對於堆,頻繁的new/delete會造成大量記憶體碎片,降低程式效率。對於棧,它是乙個先進後出(first-in-last-out)的結構,進出一一對應,不會產生碎片。

(5)*生長方向:*堆向上,向高位址方向增長;棧向下,向低位址方向增長。

(6)*分配方式:*堆是動態分配(沒有靜態分配的堆)。棧有靜態分配和動態分配,靜態分配由編譯器完成(如函式區域性變數),動態分配由alloca函式分配,但棧的動態分配資源由編譯器自動釋放,無需程式設計師實現。

(7)*分配效率:*堆由c/c++函式庫提供,機制很複雜,因此堆的效率比棧低很多。棧是機器系統提供的資料結構,計算機在底層對棧提供支援,分配專門的暫存器存放棧位址,提供棧操作專門的指令。

五、new/delete 與 malloc/free區別

細說new與malloc的10點區別

記憶體分段和分頁的區別

分段和分頁其實都是一種對位址的劃分或者對映的方式。兩者的區別主要有以下幾點 a 頁是資訊的物理單位,分頁是為實現離散分配方式,以消減記憶體的外零頭,提高記憶體的利用率 或者說,分頁僅僅是由於系統管理的需要,而不是使用者的需要 也是對使用者透明的 段是資訊的邏輯單位,它含有一組其意義相對完整的資訊 比...

作業系統中記憶體分段與記憶體分頁的區別

參考 記憶體分段和分頁的區別 分段和分頁其實都是一種對位址的劃分或者對映的方式。兩者的區別主要有以下幾點 1 頁是資訊的物理單位 段是資訊的邏輯單位 分頁是實現離散的分配方式,以消除記憶體的外零頭,提高記憶體的利用率 分段含有一組其意義相對完整的資訊 比如 資料段 段 和堆疊等 分頁僅僅是由於系統管...

記憶體分段 記憶體分頁 虛擬記憶體

程式通過鏈結器,多個檔案合併成乙個最終可執行檔案。可執行程式載入後占用的記憶體空間應該是連續的,因為執行指令的時候,程式計數器是順序地一條一條指令執行下去。這也就意味著,這一條條指令需要連續地儲存在一起。我們電腦肯定是要執行好多個程式的,在記憶體裡面肯定占用多個連續的分段,但是假如其中乙個程式退出,...