C#之CLR内存深入分析

 更新时间:2014年08月04日 14:52:11   投稿:shichen2014  
这篇文章主要介绍了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返回的就说”类型指针对象“所存储的地址。


相关文章

  • C#实现读取USB转串口参数并显示在ComboBox

    C#实现读取USB转串口参数并显示在ComboBox

    在很多应用程序中,尤其是那些需要与外部硬件通信的程序中,自动检测和读取串口参数是一个非常有用的功能,下面我们就来看看如何在C#中实现这一功能吧
    2024-01-01
  • 基于字符集、字符编码与HTTP编码解码之万象详解

    基于字符集、字符编码与HTTP编码解码之万象详解

    本篇文章小编为大家介绍,基于字符集、字符编码与HTTP编码解码之万象详解。需要的朋友参考下
    2013-04-04
  • Unity切割图集转换为多张图片

    Unity切割图集转换为多张图片

    这篇文章主要为大家详细介绍了Unity切割图集转换为多张图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • WPF弹出右键菜单时判断鼠标是否选中该项

    WPF弹出右键菜单时判断鼠标是否选中该项

    这篇文章介绍了WPF弹出右键菜单时判断鼠标是否选中该项的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C# Distinct和重写IEqualityComparer时要知道的二三事

    C# Distinct和重写IEqualityComparer时要知道的二三事

    这篇文章主要给大家介绍了关于C# Distinct和重写IEqualityComparer时要知道的二三事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • C#正则表达式Regex用法详解

    C#正则表达式Regex用法详解

    本文详细讲解了C#正则表达式Regex的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • c#生成高清缩略图的二个示例分享

    c#生成高清缩略图的二个示例分享

    这篇文章主要介绍了c#生成高清缩略图的二个示例,需要的朋友可以参考下
    2014-04-04
  • .Net(c#)汉字和Unicode编码互相转换实例

    .Net(c#)汉字和Unicode编码互相转换实例

    下面小编就为大家带来一篇.Net(c#)汉字和Unicode编码互相转换实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C#获取汉字字符串拼音首字母的方法

    C#获取汉字字符串拼音首字母的方法

    这篇文章主要介绍了C#获取汉字字符串拼音首字母的方法,实例分析了C#操作汉字及字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • C#类继承中构造函数的执行序列示例详解

    C#类继承中构造函数的执行序列示例详解

    这篇文章主要给大家介绍了关于C#类继承中构造函数的执行序列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09

最新评论