首页 / 知识
关于不可知的语言:什么是装箱和拆箱,以及要权衡哪些?
2023-04-12 07:56:00

What is boxing and unboxing and what are the trade offs?我正在寻找一个清晰,简洁和准确的答案。 理想情况下,作为实际答案,尽管欢迎提供指向良好解释的链接。 装箱值是最小化原始类型*包装的数据结构。装箱的值通常存储为指向堆上对象的指针。 因此,盒装值使用更多的内存,并且至少需要两次内存查找才能访问:一次获取指针,另一次跟随该指针到达原语。显然,这不是您想要在内部循环中执行的操作。另一方面,带框值通常在系统中的其他类型上发挥更好的作用。由于它们是该语言中的一流数据结构,因此它们具有其他数据结构所期望的元数据和结构。 在Java和Haskell中,通用集合不能包含未装箱的值。 .NET中的泛型集合可以保存未装箱的值,而不会受到惩罚。在Java的泛型仅用于编译时类型检查的情况下,.NET将为在运行时实例化的每种泛型类型生成特定的类。 Java和Haskell具有拆箱数组,但是它们明显不如其他集合方便。但是,当需要最佳性能时,避免装箱和拆箱的开销值得一点不便。 *在此讨论中,原始值是可以存储在调用堆栈中的任何值,而不是作为指向堆上值的指针存储的值。通常,这只是机器类型(整数,浮点数等),结构,有时还有静态大小的数组。 .NET-land将它们称为值类型(与引用类型相对)。 Java人士称它们为原始类型。 Haskellions只是称它们为未装箱。 **在这个答案中,我还将重点放在Java,Haskell和C#上,因为这就是我所知道的。值得一说的是,Python,Ruby和Javascript都具有专门装箱的值。这也称为"一切都是对象"方法***。 ***警告:足够高级的编译器/ JIT在某些情况下实际上可以检测到在查看源代码时在语义上装箱的值可以在运行时安全地成为未装箱的值。本质上,由于出色的语言实现者,您的盒子有时是免费的。 从C#3.0概括地说:
装箱和拆箱是将原始值转换为面向对象的包装器类(装箱),或者将值从面向对象的包装器类转换回原始值(装箱)的过程。
例如,在Java中,如果要将其存储在 装箱和拆箱并不是天生的坏事,但这是一个折衷。取决于语言的实现,它可能比仅使用基元更慢且占用更多内存。但是,它也可以使您使用更高级别的数据结构并在代码中获得更大的灵活性。 如今,最常在Java(和其他语言)"自动装箱/自动拆箱"功能的上下文中讨论它。这是以Java为中心的自动装箱说明。 在.Net中:
通常,您不能依赖于函数将使用哪种变量类型,因此您需要使用从最低公分母开始扩展的对象变量-在.Net中为
但是
虽然这两个都拥有相同的信息,但第二个列表更大且更慢。第二个列表中的每个值实际上是对保存
之所以称为盒装(Boxed),是因为
对于值类型(即所有
对于引用类型(即所有
装箱的值类型的另一个问题是,不是在处理盒子,而是在处理值。当您比较两个 在处理盒装值类型时,这可能会造成混淆:
解决起来很容易:
但是,在处理带框值时要特别注意另一件事。 .NET FCL通用集合:
旨在克服以前的集合实现中装箱和拆箱的性能问题。 有关更多信息,请参见第16章,通过C#(第二版)进行CLR。 装箱是将值类型转换为引用类型的过程。 取消装箱是将引用类型转换为值类型。
值类型为:
装箱和拆箱有助于将值类型视为对象。装箱意味着将值转换为对象引用类型的实例。例如,
像其他任何东西一样,自动装箱如果使用不当,可能会出现问题。经典的方法是以NullPointerException结尾,并且无法对其进行跟踪。即使使用调试器。尝试这个:
|
最新内容
相关内容
pythonc语言取余和python取余的区
pythonc语言取余和python取余的区别,培训,资料,语言,负数,区别,被除数,符号,除数,规定,余数,今天看书发现python与C的负数取余运算结果不同,pythonPython和r语言的区别
pythonPython和r语言的区别,数据,分析,流程,培训,工具,系统,服务,平台,代码,语言,Python与R语言的共同特点1.Python和R在数据分析和数据挖掘pythonpython是函数式语言吗
pythonpython是函数式语言吗,培训,代码,函数,概念,指数,状态,语言,变量,计算机,程度,函数是Python内建支持的一种封装,我们通过把大段代码拆成python为什么叫胶水语言
python为什么叫胶水语言,标准,代码,培训,数据,一致,环境,周期性,软件,服务,胶水,什么是胶水语言?胶水语言(gluelanguage)是用来连接软件组件python编程语言有什么用途
python编程语言有什么用途,设计,大规模,软件,培训,数据,平台,工具,生产,面临,通用,Python是一门简单易学的编程语言。阅读好的Python程序感觉pythoninput怎么解释
pythoninput怎么解释,培训,函数,版本,字符串,以后,以上,提示,原因,功能,更多,python中input函数有类似c中的scanf函数的功能。Python2中inputpythonPython语言都可以做什么
pythonPython语言都可以做什么,数据,代码,分析,培训,设备,基础,服务,时间,机器,脚本,如果您正在考虑学习Python,或者您最近刚开始学习,您可能会pythonpython是前端语言吗?
pythonpython是前端语言吗?,代码,互动,培训,平台,标准,设计,语言,前端,语法,解释性,python语言属于后端开发语言。Python是一个高层次的结合pythonpython是什么类型的语言
pythonpython是什么类型的语言,培训,系统,教育,软件,电脑,代码,简介,人工智能,类型,语言,python是一种面向对象、解释型、动态类型计算机程序python脚本语言
python脚本语言,代码,设计,情况,培训,语句,项目,基础,意外,异常,空格,Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被python为什么是胶水语言
python为什么是胶水语言,代码,标准,培训,环境,一致,系统,统一,数据,周期性,服务,胶水语言先从Helloworld开始。所有学python的童鞋都会从这句pythonpython是脚本语言吗?
pythonpython是脚本语言吗?,设计,培训,大规模,项目,软件,面临,开发者,语言,脚本语言,方法,Python是脚本语言。python是一种计算机程序设计语