装箱和拆箱

值类型是存储在线程的堆栈上,而引用类型是存放在托管堆上.
把值类型转换成Object类型或该值类型已实现的接口类型时,会造成装箱.
当值类型调用Object类中未重写的方法时,会造成装箱.
以上两种情况会造成装箱操作.
`
装箱就是把值类型从线程的堆栈上复制到托管堆上,而且创建相应的RTTI(Method Table之类的)这样性能的损耗是相当大的.
拆箱就是返回堆上的存储该已装箱对象的内存地址,性能的损耗较装箱要小,所以拆装箱并不是一对对称的操作.
`
但是往往在拆箱后有一个赋值的过程,这个过程会把拆箱返回的托管堆上的地址上的值复制到线程的堆栈上,有时把这步操作包括在拆箱中,但实际上是不是的.
`
举几个例子.
int a = default(int);
object b = a;//这时会在托管堆上创建一块内存空间,并把a的值复制到该空间,并且创建int类型的元数据信息相应的方法表之类的空间.
int c = (int)b;
这句分两步,(int)b是拆箱操作,返回一个b的地址引用.(只有这步叫拆箱)
当赋值给c时,会把地址引用的值复制给c.(这步不是拆箱操作,但拆箱后往往跟随赋值,所以有些地方把这步包含在拆箱中.)
值类型是存储在线程的堆栈上,而引用类型是存放在托管堆上.
把值类型转换成Object类型或该值类型已实现的接口类型时,会造成装箱.
当值类型调用Object类中未重写的方法时,会造成装箱.
以上两种情况会造成装箱操作.
`
装箱就是把值类型从线程的堆栈上复制到托管堆上,而且创建相应的RTTI(Method Table之类的)这样性能的损耗是相当大的.
拆箱就是返回堆上的存储该已装箱对象的内存地址,性能的损耗较装箱要小,所以拆装箱并不是一对对称的操作.
`
但是往往在拆箱后有一个赋值的过程,这个过程会把拆箱返回的托管堆上的地址上的值复制到线程的堆栈上,有时把这步操作包括在拆箱中,但实际上是不是的.
`
举几个例子.
int a = default(int);
object b = a;//这时会在托管堆上创建一块内存空间,并把a的值复制到该空间,并且创建int类型的元数据信息相应的方法表之类的空间.
int c = (int)b;
这句分两步,(int)b是拆箱操作,返回一个b的地址引用.(只有这步叫拆箱)
当赋值给c时,会把地址引用的值复制给c.(这步不是拆箱操作,但拆箱后往往跟随赋值,所以有些地方把这步包含在拆箱中.)
posted @ 2010-08-20 09:55  HiCoulee  阅读(302)  评论(0编辑  收藏  举报