堆和棧的區別

2021-06-27 05:23:06 字數 1024 閱讀 8833

對於許多新學c語言到同學,都會對堆疊一頭霧水,我就一些文章簡單總結下:

棧:後進先出;右邊一起自動分配和釋放,存放引數值、區域性變數值;屬於以及快取,在函式呼叫時候分配空間,呼叫後立即釋放。優勢在於訪問速度快。

棧的位址分配是向低位址擴充套件,是一塊連續到區域,1m或2m大小,因此容易存在棧溢位。如果想訪問較大到陣列時候,尤其是二維陣列,建議要用堆,而不用棧,太大時,很容易棧溢位。

棧的出入順序,在函式呼叫時,在大多數的c編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向函式的返回位址,也就是主函式中的下一條指令的位址,程式由該點繼續執行。

堆:先進先出,又程式設計師分配和釋放,如果不釋放到話,程式結束後os會**,儲存形式類似於鍊錶。屬於二級快取,可動態分配大小(new 出來),用malloc分配。

堆到頭部用一位元組存堆大小。

堆的位址分配是向高位址擴充套件,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。容易產生記憶體碎片。

注:在windows下,最好的方式是用virtualalloc分配記憶體,他不是在堆,也不是在棧,而是直接在程序的位址空間中保留一塊記憶體,雖然用起來最不方便。但是速度快,也最靈活。

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

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數名,區域性變數的名等。其操作方式類似於資料結構中的棧。

2、堆區(heap)— 由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。

3、靜態區(static)—全域性變數和區域性靜態變數的儲存是放在一塊的。程式結束後由系統釋放。

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

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

堆和棧區別

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

堆和棧區別

管理方式 棧由編譯器自動管理 堆由程式設計師控制,使用方便,但易產生記憶體洩露。生長方向 棧向低位址擴充套件 即 向下生長 是連續的記憶體區域 堆向高位址擴充套件 即 向上生長 是不連續的記憶體區域。這是由於系統用鍊錶來儲存空閒記憶體位址,自然不連續,而鍊錶從低位址向高位址遍歷。空間大小 棧頂位址和...

堆和棧區別

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