1. 程式人生 > >(轉)棧與堆棧的區別

(轉)棧與堆棧的區別

應用程序 寄存器 你在 編程 但是 不同 常量 好的 而不是

棧和堆棧是一個概念。

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

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

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

1.棧(Stack)是操作系統在建立某個進程時或者線程(在支持多線程的操作系統中是線程)為這個線程建立的存儲區域,該區域具有FIFO的特性,在編譯的時候可以指定需要的Stack的大小。在編程中,例如C/C++中,所有的局部變量都是從棧中分配內存空間,實際上也不是什麽分配,只是從棧頂向上用就行,在退出函數的時候,只是修改棧指針就可以把棧中的內容銷毀,所以速度最快。

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

3.在Java中除了簡單類型(int,char等)都是在堆中分配內存,這也是程序慢的一個主要原因。但是跟C/C++不同,Java中分配Heap內存是自動初始化的。在Java中所有的對象(包括int的wrapper Integer)都是在堆中分配的,但是這個對象的引用卻是在Stack中分配。也就是說在建立一個對象時從兩個地方都分配內存,在Heap中分配的內存實際建立這個對象,而在Stack中分配的內存只是一個指向這個堆對象的指針(引用)而已。

4.

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

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

*************************************************************************************************

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

*程序的局部變量存在於(棧)中,全局變量存在於(靜態區 )中,動態申請數據存在於( 堆)中;

*這樣說比較準確,所謂的棧其實是由寄存器ebp和esp指向的一片內存空間(ebp指向棧底,esp指向棧頂),原則上是由高地址向低地址生長的一片空間,會保存一些臨時的數據,比如一個函數中的臨時變量以及返回地址,數據的出入是先進後出,後進先出.

*全局變量實際上是存在一個(一般來說正常的編譯器)可讀可寫的內存空間,這個空間是在你寫程序編譯好的空間地址(由編譯器決定),是固定的.

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

*************************************************************************************************

*堆,用於保存new 和malloc這些自定義的內存變量;

*全局靜態區用於保存全局變量和靜態變量;

*字符常量區,用於保存字符串;

*代碼區,用於保存程序的二進制代碼;

(轉)棧與堆棧的區別