为了账号安全,请及时绑定邮箱和手机立即绑定

什么是拳击和拆箱以及有什么权衡取舍?

什么是拳击和拆箱以及有什么权衡取舍?

什么是拳击和拆箱以及有什么权衡取舍?我正在寻找一个清晰,简洁和准确的答案。理想情况下,作为实际答案,虽然欢迎链接到良好的解释。
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

盒装值是围绕基本类型 *的最小包装器的数据结构。盒装值通常存储为堆上对象的指针。

因此,盒装值使用更多内存并至少需要两次内存查找才能访问:一次获取指针,另一次跟随指向该基元的指针。显然,这不是你想要在内循环中的那种东西。另一方面,盒装值通常与系统中的其他类型相比更好。由于它们是该语言中的一流数据结构,因此它们具有其他数据结构所具有的预期元数据和结构。

在Java和Haskell中,泛型集合不能包含未装箱的值。.NET中的通用集合可以保留未装箱的值而不会受到惩罚。在Java的泛型仅用于编译时类型检查的情况下,.NET将为在运行时实例化的每个泛型类型生成特定的类

Java和Haskell有未装箱的数组,但它们明显不如其他集合方便。但是,当需要达到峰值性能时,为避免装箱和拆箱的开销值得一点不便。

*对于此讨论,原始值是可以存储在调用堆栈中的任何值,而不是存储为指向堆上的值的指针。通常,这只是机器类型(整数,浮点数等),结构,有时是静态大小的数组。.NET-land将它们称为值类型(与引用类型相反)。Java人称它们为原始类型。Haskellions只是将它们称为未装箱。

**我也在这个答案中专注于Java,Haskell和C#,因为这就是我所知道的。对于它的价值,Python,Ruby和Javascript都只有盒装价值。这也被称为“一切都是对象”的方法***。

***警告:在某些情况下,足够先进的编译器/ JIT实际上可以检测到在查看源时语义上装箱的值,可以在运行时安全地成为未装箱的值。实质上,由于出色的语言实现者,您的盒子有时是免费的。


查看完整回答
反对 回复 2019-08-12
?
皈依舞

TA贡献1851条经验 获得超3个赞

装箱和拆箱是将原始值转换为面向对象的包装类(装箱),或将值从面向对象的包装类转换回原始值(拆箱)的过程。

例如,在java中,如果要将int值存储为a ,则可能需要将值转换为Integer(装箱),Collection因为基元不能存储在Collection仅对象中。但是当你想要把它从它中取出时Collection你可能想要得到的价值int而不是Integer那样你就可以取消它。

拳击和拆箱本身并不,但这是一个权衡。根据语言实现,它可能比仅使用基元更慢且占用更多内存。但是,它还可以允许您使用更高级别的数据结构,并在代码中实现更大的灵活性。

目前,它最常见于Java(和其他语言)“autoboxing / autounboxing”功能的上下文中。这是一个以java为中心的autoboxing解释


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 433 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信