隊列、堆、棧、堆棧的區別?

隊列、堆、棧、堆棧的區別?

隊列是先進先出:就像一條路,有一個入口和一個出口,先進去的就可以先出去。

而棧就像一個箱子,後放的在上邊,所以後進先出。

*************************************************************************************************************************************
進程中每個線程都有自己的堆棧,這是一段線程創建時保留下的地址區域。我們的“棧內存”即在此。至於“堆”內存,我個人認爲在未用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中分配的內存只是一個指向這個堆對象的指針(引用)而已。

**********************************************************************************************************************************
堆是在程序運行時,而不是在程序編譯時,申請某個大小的內存空間。即動態分配內存,對其訪問和對一般內存的訪問沒有區別。{堆是指程序運行是申請的動態內存,而棧只是指一種使用堆的方法(即先進後出)。}

********************************************************************************************************************************
棧是先進後出的,但是於堆而言卻沒有這個特性,兩者都是存放臨時數據的地方。 對於堆,我們可以隨心所欲的進行增加變量和刪除變量,不要遵循什麼次序,只要你喜歡。
注:轉載自CSDN博客:http://blog.csdn.net/pkuyjxu/article/details/6325236#comments,原文地址不詳
原文中 “棧(Stack)是操作系統在建立某個進程時或者線程(在支持多線程的操作系統中是線程)爲這個線程建立的存儲區域,該區域具有FIFO的特性”這句話有問題,FIFO即先入先出,而棧是先入後出
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章