C 中的堆和棧

2021-09-08 19:36:49 字數 1130 閱讀 6981

原文c# 中的堆和棧

棧上儲存的有:值型別,引用型別本身。

棧記憶體就像一系列堆得越來越高的箱子。呼叫方法是,它的每乙個引數都被放入乙個箱子,並將這個箱子放到棧的最頂部。每個區域性變數也同樣分配到乙個箱子,並同樣放到棧的最頂部。方法結束後,它的所有箱子都從棧中移除。

堆上儲存的有:引用型別的「物件」,可空型別。

堆記憶體則像散布在房間裡的一大堆箱子,而不像棧那樣每個箱子都嚴格地堆在另乙個箱子上面。每乙個箱子都有乙個標籤,它標記了這個箱子是否正在使用。建立乙個新物件時,runtime 會查詢乙個空箱子,並把它分配給物件。對物件的引用則儲存在棧上的乙個區域性變數中。runtime 將跟蹤每個箱子的引用數量(有多個變數引用同乙個物件)。一旦最後乙個引用消失,runtime 就將箱子標記為「未使用」。將來某個時候,會清除箱子裡的東西,使之能被真正重用。

另外,堆記憶體是一種有限資源,如果被耗盡,new 操作符將丟擲乙個 outofmemoryexception ,物件將建立失敗。

**如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

namespace

stack_heap

void method(int

param)

} class

circle

} }

呼叫method 方法時,並給 param 傳遞實參為 8 後:

1、首先,棧中將分配一小片記憶體(剛好能儲存乙個 int),並用值 8 來初始化。

2、在方法內部,還要從棧中分配出另一小片記憶體,它剛好能夠儲存乙個引用(乙個記憶體位址),只是暫時不進行初始化(它是為cricle 型別的變數 c 準備的)。

3、接著從堆中分配乙個足夠大的記憶體區域來容納乙個 circle 物件。

ps:new 關鍵字執行的操作 --- 它執行 circle構造器將這個原始的堆記憶體轉換成乙個 circle 物件

c 中的堆和棧

1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...

c 中的堆和棧

1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...

C 中的堆和棧

在c 中,記憶體分為5個區 堆 棧 自由儲存區 靜態儲存區 或全域性儲存區 和常量儲存區。堆和棧都是c 的記憶體儲存區之一,下面介紹堆和棧對比用法 棧是機器系統提供的資料結構,是filo first in last out 結構,計算機底層對它進行了支援,棧的記憶體分配內置於處理器的指令集 分配了專...