zoukankan      html  css  js  c++  java
  • 【C#】CLR内存那点事(高级)

    对于这篇,不想再对值类型进行讨论,如要看值类型的内存怎么玩可以看一下(CLR内存那点事 初级),我们这篇主要讨论一下引用类型。

    先来装备两个类

     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返回的就说”类型指针对象“所存储的地址。

  • 相关阅读:
    转 PHP in_array() 函数
    转 PHP Cookies
    华硕笔记本怎样调整屏幕亮度
    转 Oracle 12c: Managing Resources
    转 SQLPLUS中SQL换行执行
    转 php中$_request与$_post、$_get的区别
    TDB 12c : Transportable Database
    oracle (DBaaS) 服务介绍
    domain admin域管理员
    转 【TTS】AIX平台数据库迁移到Linux--基于RMAN(真实环境)
  • 原文地址:https://www.cnblogs.com/guochenkai/p/3884991.html
Copyright © 2011-2022 走看看