• 概念
  • 示例
    • 装箱
    • 拆箱
  • 结论

概念

  • 装箱值类型引用类型转换时发生,在中分配。
  • 拆箱引用类型值类型转换时发生。

示例

装箱

        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资源。可以用泛型来解决这问题。

关于装箱拆箱为什么会影响效率相关推荐

  1. 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱

    引言 本篇文章主要介绍.NET中6个重要的概念:栈,堆,值类型,引用类型,装箱,拆箱.文章开始介绍当你声明一个变量时,编译器内部发生了什么,然后介绍两个重要的概念:栈和堆:最后介绍值类型和引用类型,并 ...

  2. Java 8 自动装箱拆箱效率影响测试

    Java 8 自动装箱拆箱效率影响测试 测试完毕之后的结论:   1. 装箱发生 232−12^{32-1}232−1 次的时候影响时间大概为10秒   2. 拆箱发生 232−12^{32-1}23 ...

  3. 反射、装箱拆箱、ArrayList与Array的区别 - 天生舞男 - 博客园

    反射.装箱拆箱.ArrayList与Array的区别 Posted on 2005-09-11 23:11 天生舞男 阅读(125) 评论(0) 编辑 收藏 引用 网摘 所属分类: SPS 1 什么是 ...

  4. CLR via C# 中关于装箱拆箱的摘录

     装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...

  5. java装箱拆箱_Java中的自动装箱与拆箱

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如 ...

  6. java 自动拆箱_Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...

  7. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  8. C#装箱,拆箱和强制转换(转)

    出处:https://www.cnblogs.com/fengjiulin110120/p/6605739.html 关系: 强制转换就包含有装箱拆箱操作,装箱就是把值类型转换成引用类型,反之就是拆箱 ...

  9. .Net装箱拆箱编程实例

    .Net装箱拆箱编程实例 一 装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型. 利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来. ...

最新文章

  1. Jenkins怎么启动和停止服务
  2. 认识微软Visual Studio Tools for AI
  3. STM32开发 -- 4G模块开发详解(4)
  4. 自定义DrawableTextView——实现TextView左上右下的点击监听
  5. Docker之Dockerfile详解
  6. 简单的Delegate(委托)例子
  7. Java反射 Class类
  8. 电脑与电脑之间数据是如何传输的(数据封装与解装)
  9. 【vue2.0进阶】用axios来实现数据请求,简单易用
  10. 权限管理系统设计_多校区的教育培训机构,如何选择培训学校crm管理系统?
  11. 【资源下载】旷视研究院张祥雨valse2019报告PPT——高效轻量级深度模型的研究与实践
  12. jdbcTemplate查询方法
  13. php获取cpu编码,PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
  14. React中refs的理解
  15. 三年前赚走马云665亿的外卖小哥,现在怎么样了?
  16. koajs mysql_koajs 项目实战(一)
  17. C语言: gotoxy函数
  18. html设置鼠标移动变色,table行随鼠标移动变色示例
  19. 【第一篇】Qt学习与使用---将数字转换成中文大写的形式
  20. 先锋建筑设计师——庞嵚作品

热门文章

  1. Unity3D DLL加密
  2. 【蓝桥杯】研究兔子的土豪
  3. 【第二十三题】带旋转的数独游戏|dfs(北理工/北京理工大学/程序设计方法与实践/小学期 )
  4. 门头发光字安装主要有两种方式
  5. docker启动容器指定端口和随机分配端口
  6. 详解---“2012世界末日”大骗局
  7. Linux修改磁盘分区后未写入分区表的解决方法(partprobe)
  8. SMS---定时短信框架
  9. 英特尔On技术创新峰会:面向开发者隆重推出全新产品、技术和工具
  10. 一起看 I/O | 隆重推出 AI 驱动的编码助手 Studio Bot