装箱拆箱性能操作
对于大多数新手朋友门,对装箱拆箱的操作就是简单的理解为:
装箱:值类型→引用类型
拆箱:引用类型→值类型
其实他们具体做了什么,我们并不知道。
在装箱过程中(高消耗):1.内存必须从托管堆分配(分配内存)
2.堆上分配的每个对象都有一些额外成员,这些成员必须初始化(初始化,复制对象)
3.对象中的其他字节(为字段而设)总是设为零(复制对象)
4.从托管堆分配一个对象时,可能强制执行一次垃圾回收操作(垃圾回收)
5.返回地址
在拆箱过程中(低消耗):拆箱就是获取一个指针的过程,指向对象中的原始类型。
引用类型在堆上分配,值类型在栈上分配
其实在于装箱的过程中。把值类型变成引用类型,会有关系到性能问题的。在我们平时不注意的情况下,在编写代码的时候自己都不知道自己其实执行了装箱操作。
例如我在不了解之前经常写是
代码A. string sql="select * from A where id="+1;
代码B string sql="select * from A where id="+1.tostring();
代码A性能就比代码B高。生成的IL代码少。
因为代码A会把1执行一次装箱,然后在和前面是string相加,而代码B不会执行一个装箱。同类型相加。就不会额外的开销了。
同类型相加是不会装箱的,异类型相加会执行装箱。为了提高性能,系统很多方法利用了重载,例如tostring();
浙公网安备 33010602011771号