1. 程式人生 > >佇列、堆、棧、堆疊的區別?

佇列、堆、棧、堆疊的區別?

*************************************************************************************************************************************
程序中每個執行緒都有自己的堆疊,這是一段執行緒建立時保留下的地址區域。我們的“棧記憶體”即在此。至於“堆”記憶體,我個人認為在未用new定義時,堆應該就是未“保留”未“提交”的自由空間,new的功能是在這些自由空間中保留(並提交)出一個地址範圍。 棧(Stack)是作業系統在建立某個程序時或者執行緒(在支援多執行緒的作業系統中是執行緒)為這個執行緒建立的儲存區域,該區域具有FIFO的特性,在編譯的時候可以指定需要的Stack的大小。在程式設計中,例如C/C++中,所有的區域性變數都是從棧中分配記憶體空間,實際上也不是什麼分配,只是從棧頂向上用就行,在退出函式的時候,只是修改棧指標就可以把棧中的內容銷燬,所以速度最快。 
堆(Heap)是應用程式在執行的時候請求作業系統分配給自己記憶體,一般是申請/給予的過程,C/C++分別用malloc/New請求分配Heap,用free/delete銷燬記憶體。由於從作業系統管理的記憶體分配所以在分配和銷燬時都要佔用時間,所以用堆的效率低的多!但是堆的好處是可以做的很大,C/C++對分配的Heap是不初始化的。 
在Java中除了簡單型別(int,char等)都是在堆中分配記憶體,這也是程式慢的一個主要原因。但是跟C/C++不同,Java中分配Heap記憶體是自動初始化的。在Java中所有的物件(包括int的wrapper  Integer)都是在堆中分配的,但是這個物件的引用卻是在Stack中分配。也就是說在建立一個物件時從兩個地方都分配記憶體,在Heap中分配的記憶體實際建立這個物件,而在Stack中分配的記憶體只是一個指向這個堆物件的指標(引用)而已。 ********************************************************************************************************************************** 堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。{堆是指程式執行是申請的動態記憶體,而棧只是指一種使用堆的方法(即先進後出)。} ******************************************************************************************************************************** 棧是先進後出的,但是於堆而言卻沒有這個特性,兩者都是存放臨時資料的地方。 對於堆,我們可以隨心所欲的進行增加變數和刪除變數,不要遵循什麼次序,只要你喜歡。