堆和棧的區別 轉貼

2021-06-21 00:23:45 字數 1916 閱讀 2617

程式的記憶體分配

乙個由c/c++編譯的程式占用的記憶體分為以下幾個部分

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。對於每個任務,它有一塊記憶體是私有的,就是stack,任務一般是通過api呼叫從heap中分配,當然也可以從data和bss分配得到。

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。如malloc,堆區是大家共享的。

3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域(data), 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域(.bss)。 - 程式結束後有系統釋放 

4、文字常量區—常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區(test)—存放函式體的二進位制**。

其實資料記憶體塊主要有.bss段、.data段和heap區。

二、例子程式 

這是乙個前輩寫的,非常詳細 

int a = 0; 全域性初始化區 

char *p1; 全域性未初始化區 

main()  

程序(執行的程式)會占用一定數量的記憶體,它或是用來存放從磁碟載入的程式**,或是存放取自使用者輸入的資料等等。不過程序對這些記憶體的管理方式因記憶體用途 不一而不盡相同,有些記憶體是事先靜態分配和統一**的,而有些卻是按需要動態分配和**的。對任何乙個普通程序來講,它都會涉及到5種不同的資料段。

linux程序的五個段

下面我們來簡單歸納一下程序對應的記憶體空間中所包含的5種不同的資料區都是幹什麼的。

bss段:

bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於

靜態記憶體分配。

資料段:資料段(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於

靜態記憶體分配。

**段:**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。

堆(heap):堆是用於存放

程序執行

中被動態分配

的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

棧(stack):棧又稱堆疊, 是使用者

存放程式臨時建立的區域性變數

,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進後出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

它是由作業系統分配的,記憶體的申請與**都由os管理。

ps:全域性的未初始化變數存在於.bss段中,具體體現為乙個佔位符;全域性的已初始化變數存於.data段中;而函式內的自動變數都在棧上分配空間。.bss是不占用.exe檔案空間的,其內容由作業系統初始化(清零);而.data卻需要占用,其內容由程式初始化,因此造成了上述情況。

bss段(未手動初始化的資料)並不給該段的資料分配空間,只是記錄資料所需空間的大小。

data(已手動初始化的資料)段則為資料分配空間,資料儲存在目標檔案中。 資料段包含經過初始化的全域性變數以及它們的值。bss段的大小從可執行檔案中得到 ,然後鏈結器得到這個大小的記憶體塊,緊跟在資料段後面。當這個記憶體區進入程式的位址空間後全部清零。包含資料段和bss段的整個區段此時通常稱為資料區。

堆和棧的區別 轉貼

堆和棧的區別 轉貼,作者為一c 程式設計師,具體姓名不清楚 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋...

堆和棧的區別 轉貼

堆和棧的區別 轉貼 非本人作也 因非常經典,所以收歸旗下,與眾人閱之 原作者不祥 堆和棧的區別 一 預備知識 程式的記憶體分配乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區...

堆和棧的區別(轉的,留個備份)

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