堆與堆疊的區別

2021-08-28 21:33:25 字數 1128 閱讀 6429

棧和堆疊是乙個概念。

佇列先進先出,在隊頭做刪除操作,在隊尾做插入操作。

棧先進後出,在棧頂做插入和刪除操作。

堆和它們不同,不存在是先進後出還是先進先出。

1.棧(stack)是作業系統在建立某個程序時或者執行緒(在支援多執行緒的作業系統中是執行緒)為這個執行緒建立的儲存區域,該區域具有fifo的特性,在編譯的時候可以指定需要的stack的大小。在程式設計中,例如c/c++中,所有的區域性變數都是從棧中分配記憶體空間,實際上也不是什麼分配,只是從棧頂向上用就行,在退出函式的時候,只是修改棧指標就可以把棧中的內容銷毀,所以速度最快。 

2.堆(heap)是應用程式在執行的時候請求作業系統分配給自己記憶體,一般是申請/給予的過程,c/c++分別用malloc/new請求分配heap,用free/delete銷毀記憶體。由於從作業系統管理的記憶體分配所以在分配和銷毀時都要占用時間,所以用堆的效率低的多!但是堆的好處是可以做的很大,c/c++對分配的heap是不初始化的。 

4.堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。

5.棧是先進後出的,但是對於堆而言卻沒有這個特性,兩者都是存放臨時資料的地方。 對於堆,我們可以隨心所欲的進行增加變數和刪除變數,不要遵循什麼次序,只要你喜歡。

從變數儲存方面來看堆和棧的區別:

*程式的區域性變數存在於(棧)中,全域性變數存在於(靜態區 )中,動態申請資料存在於( 堆)中;

*這樣說比較準確,所謂的棧其實是由暫存器ebp和esp指向的一片記憶體空間(ebp指向棧底,esp指向棧頂),原則上是由高位址向低位址生長的一片空間,會儲存一些臨時的資料,比如乙個函式中的臨時變數以及返回位址,資料的出入是先進後出,後進先出.

*全域性變數實際上是存在乙個(一般來說正常的編譯器)可讀可寫的記憶體空間,這個空間是在你寫程式編譯好的空間位址(由編譯器決定),是固定的.

*堆是由作業系統管理的一片空間,事先是沒有在程序空間裡分配的(比如你在沒有分配堆的時候就訪問堆空間會報乙個記憶體訪問錯誤),一般是由程式動態的分配出來,一旦分配了以後,一般需要程式去釋放自己的堆空間.

*堆,用於儲存new 和malloc這些自定義的記憶體變數;

*全域性靜態區用於儲存全域性變數和靜態變數;

*字元常量區,用於儲存字串;

***區,用於儲存程式的二進位制**;

堆和堆疊的區別

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

堆和堆疊的區別

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

堆和堆疊的區別

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