棧與堆的區別

2022-01-28 20:04:35 字數 903 閱讀 1659

關於記憶體的使用,棧(stack)和堆(heap)是非常重要的兩個概念,網上講解的資料也比較多,大家也應該知道棧和堆分別的用途是什麼,接下來說一下我對棧與堆的本質區別的理解。

每個程式在執行時系統都會分配一塊叫做棧的連續的記憶體區域,大小一般為1m或2m,是編譯程式時指定的常數。堆則是系統中所有空閒的記憶體區域,因此是不連續的,而且有可能是虛擬記憶體。函式的呼叫和返回是通過棧來實現的,不細說了。程式中用到的變數(物件)所佔據的記憶體空間既可以從棧上分配,也可以從堆中分配,區別如下:

1. 記憶體指標的性質不同

棧上面只能分配長度較小、大小固定的資料,變數的記憶體位址相對於棧指標的偏移量在編譯時就可以確定,因而可以生成直接的記憶體訪問的指令。

堆上面分配的空間大小在執行時指定,並且返回的記憶體位址只能在執行時得知,因此棧上需要有乙個相應的變數來儲存堆上分配的記憶體位址,位址的長度為32位或64位。於是訪問堆上的記憶體單元只能通過間接訪問的指令來操作。

2. 記憶體空間的**方式不同

棧上面分配的內存在壓棧和出棧的過程中自動分配自動**,速度很快。

堆上面分配的記憶體則需要顯式地釋放掉或者做垃圾**的處理,有可能會漏掉釋放,造成所謂的記憶體洩漏。

理解棧和堆的概念對於編寫正確的高效的程式非常重要,但是程式語言的語法對棧和堆的體現很隱晦。c++建立乙個類的例項時,既可以指定在棧上分配,也可以指定在堆上分配。c#中值型別的變數在棧上分配,引用型別的變數在堆上分配,值型別的變數也可以通過裝箱的方式在堆上分配,在unsafe**中可以在棧上分配大小固定的位元組陣列,總的來說沒有c++靈活。

最後做乙個練習,思考一下下面的程式在執行中記憶體是怎樣分配的:

public

struct

apublic

class

bpublic

class

p and 

", a, b);}}

堆與棧區別

檢視文章 關於記憶體中棧和堆的區別 2008 09 02 17 12 1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器...

棧 與 堆 的區別

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

堆與棧的區別

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