装箱拆箱性能操作

对于大多数新手朋友门,对装箱拆箱的操作就是简单的理解为:

装箱:值类型→引用类型

拆箱:引用类型→值类型

其实他们具体做了什么,我们并不知道。

在装箱过程中(高消耗):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();

posted on 2013-08-13 18:05  Cheney_Lee  阅读(101)  评论(0)    收藏  举报