当前位置: 首页 > news >正文

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

转载于:https://www.cnblogs.com/guochenkai/p/3884991.html

相关文章:

  • c语言编译过程及cc 的使用
  • 贷款减值准备和折现回拨
  • Oracle 内置函数
  • 深入浅出的英语口语700句zz
  • vc-api-枚举所有子窗口实例
  • VC 获取鼠标下面的窗口
  • [SE]软件项目需求分析为什么困难
  • JS求一个字符串的长度
  • JS中的prototype
  • html5 Canvas 如何自适应屏幕大小
  • 手机web——自适应网页设计(html/css控制)
  • @media screen 针对不同移动设备
  • 网站页面性能优化的34条黄金守则
  • IE和Firefox的Javascript兼容性总结
  • HTML本地存储之IndexedDB(1)
  • 【EOS】Cleos基础
  • Angular数据绑定机制
  • Cookie 在前端中的实践
  • go append函数以及写入
  • Java面向对象及其三大特征
  • js算法-归并排序(merge_sort)
  • js学习笔记
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • nfs客户端进程变D,延伸linux的lock
  • PHP面试之三:MySQL数据库
  • Python语法速览与机器学习开发环境搭建
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 安卓应用性能调试和优化经验分享
  • 前端js -- this指向总结。
  • 前嗅ForeSpider采集配置界面介绍
  • 区块链共识机制优缺点对比都是什么
  • 突破自己的技术思维
  • 网络应用优化——时延与带宽
  • 系统认识JavaScript正则表达式
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 译自由幺半群
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 最近的计划
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 安徽锐锋科技IDMS系统简介
  • #微信小程序:微信小程序常见的配置传旨
  • ${ }的特别功能
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Forward) Music Player: From UI Proposal to Code
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计ssm-Java网名推荐系统