堆,棧,託管堆

2022-08-31 13:42:09 字數 940 閱讀 7813

在計算機領域,堆疊是乙個不容忽視的概念,但是很多人甚至是計算機專業的人也沒有明確堆疊其實是兩種資料結構。

堆疊都是一種資料項按序排列的資料結構,只能在一端(稱為棧頂(top))對資料項進行插入和刪除。

要點:堆:順序隨意

棧:後進先出(last-in/first-out)

值型別總是在記憶體中占用乙個預定義的位元組數(例如,int型別佔4個位元組,而string型別占用的位元組數會根據字串的長度不同而不同),當宣告乙個值型別變數時,會在棧中分配適當大小的記憶體(除了引用型別的值型別成員外,如類的int欄位),記憶體中的這個空間用來儲存變數所含的值。.net維護乙個棧指標,它包含棧中下乙個可用記憶體空間的位址。當乙個變數離開作用域時,棧指標向下移動被釋放變數所占用的位元組數,所以它仍指向下乙個可用位址。

引用變數也利用棧,但這時棧包含的只是對另乙個記憶體位置的引用,而不是實際值。這個位置是託管堆中的乙個位址。和棧一樣,它也維護乙個指標,包含堆中下乙個可用記憶體空間的位址。但是,堆不是先入後出的,因為對物件的引用可在我們的程式中傳遞(例如,作為引數傳遞給方法呼叫),堆中的物件不會在程式的乙個預定點離開作用域。為了在不使用在堆中分配的記憶體時將它釋放,.net定期執行垃圾收集。垃圾收集器遞迴地檢查應用程式中所有的物件引用。引用不再有效的物件使用的記憶體無法從程式中訪問,該記憶體就可以**。

引用型別包含乙個指標,指向堆中儲存物件本身的位置。因為引用型別只包含引用,不包含實際的值,對方法體內引數所做的任何修改都將影響傳遞給方法呼叫的引用型別的變數。

使用基於clr的語言編譯器開發的**稱為託管**。 

託管堆是clr中自動記憶體管理的基礎。初始化新程序時,執行時會為程序保留乙個連續的位址空間區域。這個保留的位址空間被稱為託管堆。託管堆維護著乙個指標,用它指向將在堆中分配的下乙個物件的位址。最初,該指標設定為指向託管堆的基址。

託管堆與堆疊

記憶體格局通常分為四個區 全域性資料區 存放全域性變數,靜態資料,常量 區 存放所有的程式 棧區 存放為執行而分配的區域性變數,引數,返回資料,返回位址等,堆區 即自由儲存區 值型別變數與引用型別變數的記憶體分配模型也不一樣。為了理解清楚這個問題,讀者首 先必須區分兩種不同型別的記憶體區域 執行緒堆...

託管堆與堆疊

記憶體格局通常分為四個區 全域性資料區 存放全域性變數,靜態資料,常量 區 存放所有的程式 堆區 即自由儲存區 值型別變數與引用型別變數的記憶體分配模型也不一樣。為了理解清楚這個問題,讀者首 先必須區分兩種不同型別的記憶體區域 執行緒堆疊 thread stack 和託管堆 managed heap...

堆疊,託管堆,堆,棧的區別

博主做了兩年的程式設計師了看網上的文章有時候各種迷惑,今天終於弄明白了這四個詞之間的關係,由於之前是寫c 的,之後又寫了c 所以就各種迷茫.一下是正確答案 c 堆 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 它與資料結構中的堆是兩回事,分配方式類似鍊錶.棧 stac...