IL and 堆於棧

CIL的基本構成+CIL操做碼速記表+CIL操做碼大全速查html

 

引用類型:引用類型存儲在堆中。類型實例化的時候,會在堆中開闢一部分空間存儲類的實例。類對象的引用仍是存儲在棧中。ide

值類型:值類型老是分配在它聲明的地方,作爲局部變量時,存儲在棧上;類對象的字段時,則跟隨此類存儲在堆中。lua

 

http://www.javashuo.com/article/p-rkisrukt-hg.htmlspa

 

http://www.cnblogs.com/kirinboy/archive/2012/06/12/value-and-reference-in-csharp-1.htmlhtm

 

IL對象

 

ILblog

關鍵字:.method表示方法的意思,.method private hidebysig static void  Main(string[] args) cil managed表示的意思就是static void main(string[] args)索引

  .entrypoint標誌方法的入口ci

  .maxstack表示分配堆棧大小get

  .locals init中存放的是當前方法的局部變量,這裏面是string類型,它的名稱叫hello。Init指令表示對變量應以對應的類型默認值進行初始化,一般狀況下變量名能夠省略,在代碼中將以零基索引來引用

  例如:stloc.0表示將Envaluation Stack中的一個棧頂數值保存到局部變量0(Call Stack)中。

  先介紹幾個關於MSIL內部知識點:

  ①.Managed Heap:這是動態配置(Dynamic Allocation)的記憶體,由 Garbage Collector(GC)在執行時自動管理,整個 Process 共用一個 Managed Heap,能夠理解爲引用類型的東西都放在這個Managed Heap中。

  ②.Call Stack:這是由 .NET CLR 在執行時自動管理的記憶體,每一個Thread都有本身的Call Stack堆棧。每調用一次method,就會使得Call Stack上多了一個Record Frame;調用完畢以後,此Record Frame會被丟棄。通常來講,Record Frame內記錄着method參數(Parameter)、返回位址(Return Address)、以及局部變量(Local Variable)。.NET CLR都是使用0, 1, 2…編號的方式來識別局部變量。

  ③.Evaluation Stack:這是由.NET CLR在執行時自動管理的記憶體,每一個Thread都有本身專屬的Evaluation Stack。壓入的到Evaluation Stack的值,當方法調用結束時必須保持這個堆棧的平衡,這裏面存放例如局部變量值,以及引用類型的地址。

  指令ldc是將參數存儲至堆棧Evaluation Stack

  指令stloc是將變量存儲至堆棧Call Stack

  技巧:ld開頭就是加載數據到Evaluation Stack中,而st開頭就是將Envaluation Stack中的數據保存到Call StackCall Stack存放局部變量值。

  接下來咱們將演示代碼的堆棧狀況。

相關文章
相關標籤/搜索