关于装箱拆箱为什么会影响效率
- 概念
- 示例
- 装箱
- 拆箱
- 结论
概念
- 装箱在值类型向引用类型转换时发生,在堆中分配。
- 拆箱在引用类型向值类型转换时发生。
示例
装箱
public void BoxIn(){object tempObj = 4;}
示意:将整型常量1赋给object类型的变量obj;值类型是要放在栈上的,而object是引用类型,它需要放在堆上;要把值类型放在堆上就需要执行一次装箱操作。
- 利用ildasm 查看IL代码
.method public hidebysig instance void BoxIn() cil managed {// Code size 8 (0x8).maxstack 2.locals init (object V_0)/*声明object类型的名称为objValue的局部变量 */IL_0000: ldc.i4.4 /*小于8大于0的情况下用的是ldc.i4 num ,而大于8 和小于0又是针对32位(在64 位下还有ldc.i8 num )的机器编程就用 ldc.i4.s num */;IL_0001: box [mscorlib]System.Int32 /*执行IL box指令,在内存堆中申请System.Int32类型需要的堆空间*/IL_0006: stloc.0 /*弹出堆栈上的变量,将它存储到索引为0的局部变量中*/IL_0007: ret } // end of method Test::BoxIn
拆箱
public void BoxOut(){object tempObj = 9;int tempInt = (int)tempObj;}
示意:首先进行一次装箱操作将整形数字装箱成引用类型;然后又执行一次拆箱操作,将存储到堆上的引用变量tempObj存储到局部整形值类型变量tempInt 中。
- 同理利用ildasm 查看IL代码
.method public hidebysig instance void BoxOut() cil managed {// Code size 16 (0x10).maxstack 2.locals init (object V_0,int32 V_1)IL_0000: ldc.i4.s 9IL_0002: box [mscorlib]System.Int32IL_0007: stloc.0 /*运行原理同上*/IL_0008: ldloc.0 /*将索引为0的局部变量(即tempObj变量)压入栈*/IL_0009: unbox.any [mscorlib]System.Int32 /*执行拆箱指令将引用类型object转换成System.Int32类型*/IL_000e: stloc.1/*将栈上的数据存储到索引为1的局部变量即tempInt*/IL_000f: ret } // end of method Test::BoxOut
结论
可见,执行装箱操作时不可避免的要在堆上申请内存空间,并将堆栈上的值类型数据复制到申请的堆内存空间上,因此消耗内存和cpu资源。可以用泛型来解决这问题。
关于装箱拆箱为什么会影响效率相关推荐
- 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并 ...
- Java 8 自动装箱拆箱效率影响测试
Java 8 自动装箱拆箱效率影响测试 测试完毕之后的结论: 1. 装箱发生 232−12^{32-1}232−1 次的时候影响时间大概为10秒 2. 拆箱发生 232−12^{32-1}23 ...
- 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园
反射.装箱拆箱.ArrayList与Array的区别 Posted on 2005-09-11 23:11 天生舞男 阅读(125) 评论(0) 编辑 收藏 引用 网摘 所属分类: SPS 1 什么是 ...
- CLR via C# 中关于装箱拆箱的摘录
装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...
- java装箱拆箱_Java中的自动装箱与拆箱
自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如 ...
- java 自动拆箱_Java中的自动装箱拆箱
Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...
- Java自动装箱/拆箱 - Java那些事儿
昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...
- C#装箱,拆箱和强制转换(转)
出处:https://www.cnblogs.com/fengjiulin110120/p/6605739.html 关系: 强制转换就包含有装箱拆箱操作,装箱就是把值类型转换成引用类型,反之就是拆箱 ...
- .Net装箱拆箱编程实例
.Net装箱拆箱编程实例 一 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型. 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来. ...
最新文章
- Jenkins怎么启动和停止服务
- 认识微软Visual Studio Tools for AI
- STM32开发 -- 4G模块开发详解(4)
- 自定义DrawableTextView——实现TextView左上右下的点击监听
- Docker之Dockerfile详解
- 简单的Delegate(委托)例子
- Java反射 Class类
- 电脑与电脑之间数据是如何传输的(数据封装与解装)
- 【vue2.0进阶】用axios来实现数据请求,简单易用
- 权限管理系统设计_多校区的教育培训机构,如何选择培训学校crm管理系统?
- 【资源下载】旷视研究院张祥雨valse2019报告PPT——高效轻量级深度模型的研究与实践
- jdbcTemplate查询方法
- php获取cpu编码,PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
- React中refs的理解
- 三年前赚走马云665亿的外卖小哥,现在怎么样了?
- koajs mysql_koajs 项目实战(一)
- C语言: gotoxy函数
- html设置鼠标移动变色,table行随鼠标移动变色示例
- 【第一篇】Qt学习与使用---将数字转换成中文大写的形式
- 先锋建筑设计师——庞嵚作品