【CLR】数据类型与装箱、拆箱

本文深入解析了.NET中对象创建的过程,包括计算实例字段大小、分配内存、初始化类型对象指针和同步块索引以及调用构造函数。同时,探讨了装箱和拆箱的概念,指出值类型由于不需垃圾回收和通过指针引用而运行更快。此外,详细介绍了类型对象指针在识别对象类型以及同步块索引在多线程同步中的作用。
摘要由CSDN通过智能技术生成

类型有:基元类型(int、long、bool等编译器直接支持的类型)、值类型、引用类型。

所有的类型都派生自System.Object

当我们new一个对象时,new操作实际做了这些事情:

  1. 计算当前类型及其所有父类,且一直计算到System.Object中定义的所有实例字段需要的字节数,这些实例字段的“类型对象指针”和“同步块索引”对象所需要的字节数。
  2. 从堆中分配这些字节,并初始化为0
  3. 初始化类型对象指针和同步块索引
  4. 调用类的构造函数

类型对象指针:当我们想查看某个对象是属于什么类型时,一般会调用GetType()或者typeof()方法,这个方法返回这个对象的具体类型,那么这两个方法怎么知道这个对象是什么类型呢?就是根据这个对象里的这个类型对象指针来找的,类型对象本质也是对象,所以就返回了这个对象。
同步块索引:线程同步用的,比如当我们lock住了某个对象,另外一个线程也执行到这里时,操作系统怎么知道是该阻塞还是该放行呢?就是根据这个同步块索引。具体的实现可以参考线程同步那篇文章。

装箱和拆箱

概念都不用解释了。值类型比引用类型“快”,主要是因为它们不在堆中分配,不需要被GC,也不用通过指针进行引用。
装箱
值类型转为引用类型,对应参考代码(object)i,主要发生了下面这些事情:

  1. 在托管堆中分配内存,所需内存的大小就是值类型各字段所需要的内存量+类型对象指针的内存量+同步块索引的内存量
  2. 将值类型的字段复制到新分配的堆内存中
  3. 返回这个对象的指针

拆箱
引用类型转为值类型,对应代码(int)obj,主要发生了这件事:

  1. 获取已装箱对象中各个字段在堆上的地址

拆箱不是简单的把装箱倒过来操作,拆箱简单的多,就是一个获取地址的操作。对于以下代码:
int a=(int)obj;其实有两步操作,第一步就是获取在堆上的地址,第二步是赋值操作引起的将堆上的内容复制到栈上的操作,第二步其实不属于拆箱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JimCarter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值