程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#之CLR內存深刻剖析

C#之CLR內存深刻剖析

編輯:C#入門知識

C#之CLR內存深刻剖析。本站提示廣大學習愛好者:(C#之CLR內存深刻剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#之CLR內存深刻剖析正文


本文不再對值類型停止評論辯論,重要評論辯論一下援用類型。如要看內存值類型的同伙可以看一下前一篇C#之CLR內存道理初探。

C#援用類型詳細剖析以下:

先來設備兩個類:

internal class Employee
{
 public static Employee LookUp(string name)
 {
  return null;
 }

 public virtual string GetProgressReport()
 {
  return string.Empty;
 }
}

internal class Manager : Employee
{
 public override string GetProgressReport()
 {
  return string.Empty;
 }
}

Employee類裡有一個虛辦法GetProgressReport和一個靜態辦法LookUp,Manager類繼續了Employee偏重寫了GetProgressReport.

static void Main(string[] args)
{
 Employee e = new Manager();
 e = e.LookUp("Tom");
 e.GetProgressReport();
}

 我們在Main外面寫上如許的代碼,再來對比著下圖看看棧和堆是怎樣運作的。

 當JIT編譯器將這些IL代碼轉換本錢地CPU指令時,會留意到一切的類型:Employee,Manager,String(因為Tom字符串).

1.當運轉辦法之前,"prologue"代碼會為這些對象在內存中開拓空間。

2.Employee e=new Manager();會把e壓入棧,然後保留Manager對象地址,我們在低級篇的時刻說過,每一個對象都有一個同步塊索引和類型對象指針,這個指針就是內存的地址。

3.e=Employee.LookUp("Tom");挪用一個靜態辦法時,CLR會定位與界說靜態辦法的類型對應的類型對象。然後JIT編譯器在類型對象的辦法表中查找與被挪用的辦法對應的記載項,對辦法停止JIT編譯(假如須要的話),再挪用JIT編譯的代碼。這個時刻我們曉得LoopUp前往的是Employee對象(這時候,我們一開端創立的Manager對象還不確認有無被消除,由於GC會主動去清算這些托管代碼),所以在堆下面開拓一個Employee的內存塊並把e的地址轉變成Employee對象地點的地位。 

留意:Employee和Manager類型對象都包括了“類型指針對象”成員。這時候因為類型對象實質上也是對象。CLR創立類型對象時,必需初始化這些成員。初始化成甚麼呢?CLR開端在一個過程中運轉時,會立刻為MSCorLib.dll中界說的System.Type類型創立一個特別的類型對象。Employee和Manager類型對象都是該類型的”實例“。 是以,它們的類型對象指針成員會初始化成對System.Type類型對象的援用。

趁便說一句Object.GetType前往的就說”類型指針對象“所存儲的地址。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved