堆和棧的含義,值類型和引用類型 值類型和引用類型,棧和堆的含義

   本文主要是討論棧和堆的含義,也就是C#的兩種類據類型:值類型和引用類型;

 1、堆與棧

  •   什麼是堆(Heap)?

☞   堆是無序的,是一片不連續的內存域,由用戶本身來控制和釋放,若是用戶本身不釋放的話,當內存達到必定的特定值時或程序運行結束時,經過垃圾回收器(GC)來回收。html

☞   是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。post

  •   什麼是棧(Stack)?

☞   棧是有順序的,是一片連續的內存域,保持着先進後出的原則,由系統自動分配和維護。url

☞   是編譯期間就分配好的內存空間,所以代碼中必須就棧的大小有明確的定義。spa

      即, 所分配的內存是在一塊連續的內存區域內.當咱們聲明變量時,那麼編譯器會自動接着當前棧區的結尾來分配內存。.net

 二、值類型與引用類型

  •   概念:值類型直接存儲其值在線程棧中,引用類型存儲對其值的引用。部署:託管堆上部署了全部引用類型。這裏須要指出一點:若是一個引用類型中的某個屬性是值類型,這個值類型的屬性是分配在託管堆上的。
  •   引用類型:基類爲Objcet
  •   值類型:均隱式派生自System.ValueType;
  •   值類型與引用類型表:

  • 內存分配             

☞  值類型變量聲明後,不管是否已經賦值,編譯器都會爲其分配內存。線程

☞  引用類型當聲明一個類時,只會在棧中分配一小塊內存用於存放引用地址,此時並無爲其分配堆上的空間。當類實例化時,分配內存空間,並把堆上空間的地址保存到棧上分配的小塊空間中。3d

☞  值類型的實例一般是在線程棧上分配的(靜態分配),可是在某些情形下能夠存儲在堆中。htm

☞  引用類型的對象老是在進程堆中分配(動態分配)。對象

  • 示例代碼

 

運行結果blog

 

   

從圖中咱們能夠看出,兩個引用類型sc1,sc2都指向同一個託管堆上的空間,因此最後一個指向的會覆蓋掉前面的。

而結構是值類型,雖然使用sv2=sv1,把sv1對象賦值給sv2,可是它會在線程棧中分配一個獨立的空間,當修改某一個對象的值的時候,不會影響到另外一個對象 

因此,值類型和引用類型的區別就是:

            一、它們存儲的位置不同

            二、若是是引用類型,當兩個對象指向同一個地方,修改某一個的時候,其它對象的值會發生改變

 

內容參考來自文章:

值類型和引用類型,棧和堆的含義

C#詳解值類型和引用類型區別

   

  做者:遙遠的Ta

相關文章
相關標籤/搜索