通常装箱和拆箱都有较大的性能损害,相比之下,装箱损害会更大,主要表现在需要的内存和产生的代码大小和所做的工作量等方面
- 装箱是将值类型转换为引用类型的过程,装箱通常由以下几步完成:
1.按值类型对象所需的内存空间和额外成员(一个指向方法表的指针和一个SyncBlockIndex)在托管堆中分配内存空间。
2.将值类型实例的字段拷贝到托管堆新分配对象的内存空间中。
3.返回新对象托管堆中的引用(指针)。值类型实例由此变成了引用类型。
- 拆箱将已装箱的引用类型转换成值类型。严格来讲,拆箱并不是装箱的逆向过程。其过程为:
1.先找到已装箱的引用类型中的值类型字段的指针。这也就是拆箱过程所做的工作,仅仅获取对象中指向值类型的指针。
之后,紧接着将对象中值类型的字段拷贝到目标值类型中。
这两个过程加起来才是装箱的反向过程。
一般出现装箱的情况:
》将值类型赋值给引用类型
》调用值类型基类中实现而在当前类又没有重写的方法。对这种情况解释一下,当调用基类中的方法时,需要一个指向基类的方法表的指针,而这个指针只有引用类型才胡,值类型是没有的,所以需要装箱。