为什么是API而不是java_为什么Java API使用int而不是short或byte?

本文探讨了Java中字节和短整型在运算时提升至int类型的原因,这主要与Java虚拟机(JVM)的指令集设计有关。JVM的指令集仅支持int和long类型的算术运算,不适用于较小类型,以减少指令数量并适应32位架构。此外,即使使用较小类型,由于Java类文件格式,字段声明为short或byte也不会节省内存。
摘要由CSDN通过智能技术生成

一些原因已经被指出。例如,事实

“…(Almost) All operations on byte, short will promote these primitives to int”.然而,明显的下一个问题是:为什么这些类型提升为int?

所以要走得更深一层:答案可能只是与Java虚拟机指令集相关。如在Table in the Java Virtual Machine Specification中所概述的,所有积分算术运算,例如加法,除法和其他,仅可用于类型int和类型long,而不适用于较小类型。

(an aside:较小的类型(字节和短)基本上只用于数组,像new byte [1000]这样的数组将占用1000字节,像new int [1000]这样的数组需要4000字节)

现在,当然,可以说“…明显的下一个问题是:为什么这些指令只提供int(和长)?”。

一个原因在上面提到的JVM规范中提到:

If each typed instruction supported all of the Java Virtual Machine’s run-time data types, there would be more instructions than could be represented in a byte

另外,Java虚拟机可以被认为是真实处理器的抽象。而对于较小型号引入专用Arithmetic Logic Unit将不值得努力:它将需要额外的晶体管,但它仍然只能在一个时钟周期中执行一次加法。设计JVM时的主要架构是32位,刚好适合32位int。 (涉及64位长的值的操作被实现为特殊情况)。

(注意:最后一段有点过于简单,考虑可能的矢量化等,但应该给出基本的想法,而不必深入处理器设计主题)

编辑:一个简短的附录,集中在问题的例子,但在更一般的意义:还可以问,使用较小的类型存储字段是否会是有益的。例如,人们可能认为通过将Calendar.DAY_OF_WEEK存储为字节可以节省内存。但这里,Java类文件格式发挥作用:所有Fields in a Class File占用至少一个“slot”,其大小为一个int(32位)。 (“宽”字段,双长和长,占用两个槽)。所以显式声明一个字段为short或byte不会保存任何内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值