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

标签 optimization types java

为什么 Java API 使用 int,而 short 甚至 byte 就足够了?

示例:DAY_OF_WEEK类中的字段 Calendar使用 int

如果差异太小,那为什么还存在这些数据类型(shortint)?

最佳答案

已经指出了一些原因。例如,"...(Almost) All operations on byte, short will promote these primitives to int" .然而,下一个明显的问题是:为什么这些类型被提升为 int

所以更深入一点:答案可能只是与 Java 虚拟机指令集有关。正如 Table in the Java Virtual Machine Specification 中总结的那样, all 积分算术运算,如加法、除法等,仅适用于 int 类型和 long 类型,以及 较小的类型。

(顺便说一句:较小的类型(byteshort)基本上只适用于 数组。一个 new byte[1000] 这样的数组 将占用 1000 个字节,像 new int[1000] 这样的数组将占用 4000 个字节)

当然,现在可以说 "...下一个明显的问题是:为什么这些指令只提供给 int(以及)?”

上面提到的JVM Spec中提到了一个原因:

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 位 long 值的操作作为特例实现)。

(注意:考虑到可能的矢量化等,最后一段有点过于简单了,但应该给出基本概念,而不需要深入探讨处理器设计主题)


编辑:一个简短的附录,重点关注问题中的示例,但在更一般的意义上:人们也可以询问使用较小的类型存储 fields 是否有益。例如,有人可能认为可以通过将 Calendar.DAY_OF_WEEK 存储为 byte 来节省内存。但在这里,Java 类文件格式开始发挥作用:所有 Fields in a Class File占用至少一个“槽”,其大小为一个 int(32 位)。 (“宽”字段 doublelong 占用两个插槽)。因此,将字段显式声明为 shortbyte 也不会节省任何内存。

关于optimization - 为什么 Java API 使用 int 而不是 short 或 byte?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27122610/

相关文章:

php - 无法在 PHP 中设置变量类型

java - IDEA Java swing GUI 形式 Jtable。表模型被自动生成的代码覆盖

python - Python 中使用行数作为输入变量拆分大文本文件的快速方法

python - 无法在马尔可夫政权切换模型中的属性类中设置属性

c - 字符串集的数据结构

Java - 在调用堆栈中处理更高的异常?

python - 是否可以在不关心大小的情况下检查 numpy dtype?

haskell - 如何表达 'takeWhile for vectors' 的类型?

java - 在 Java 中按 3 组用空格拆分数字