1. 程式人生 > >託管堆與堆疊

託管堆與堆疊

記憶體格局通常分為四個區

  全域性資料區:存放全域性變數,靜態資料,常量

  程式碼區:存放所有的程式程式碼

  棧區:存放為執行而分配的區域性變數,引數,返回資料,返回地址等,

  堆區:即自由儲存區

值型別變數與引用型別變數的記憶體分配模型也不一樣。為了理解清楚這個問題,讀者首

先必須區分兩種不同型別的記憶體區域:執行緒堆疊(Thread Stack)和託管堆(Managed Heap)。

每個正在執行的程式都對應著一個程序(process),在一個程序內部,可以有一個或多

個執行緒(thread),每個執行緒都擁有一塊“自留地”,稱為“執行緒堆疊”,大小為1M,用於保

存自身的一些資料,比如函式中定義的區域性變數、函式呼叫時傳送的引數值等,這部分記憶體

區域的分配與回收不需要程式設計師干涉。

所有值型別的變數都是線上程堆疊中分配的。

另一塊記憶體區域稱為“堆(heap)”,在.NET 這種託管環境下,堆由CLR 進行管理,所

以又稱為“託管堆(managed heap)”。

用new 關鍵字建立的類的物件時,分配給物件的記憶體單元就位於託管堆中。

在程式中我們可以隨意地使用new 關鍵字建立多個物件,因此,託管堆中的記憶體資源

是可以動態申請並使用的,當然用完了必須歸還。

打個比方更易理解:託管堆相當於一個旅館,其中的房間相當於託管堆中所擁有的記憶體

單元。當程式設計師用new 方法建立物件時,相當於遊客向旅館預訂房間,旅館管理員會先看

一下有沒有合適的空房間,有的話,就可以將此房間提供給遊客住宿。當遊客旅途結束,要

辦理退房手續,房間又可以為其他旅客提供服務了。

從表 1 可以看到,引用型別共有四種:類型別、介面型別、陣列型別和委託型別。

所有引用型別變數所引用的物件,其記憶體都是在託管堆中分配的。

嚴格地說,我們常說的“物件變數”其實是類型別的引用變數。但在實際中人們經常將

引用型別的變數簡稱為“物件變數”,用它來指代所有四種類型的引用變數。

http://blog.csdn.net/baoxuetianxia/article/details/3218913


--------------------- 
作者:lyncai 
來源:CSDN 
原文:https://blog.csdn.net/Lyncai/article/details/9664667 
版權宣告:本文為博主原創文章,轉載請附上博文連結!