gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:19:13 25 4
gpt4 key购买 nike

为什么 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 中所总结的,所有整型算术运算,例如加法、除法等,仅适用于int类型和long类型,并且不适用于较小的类型。

(旁白:较小的类型(byteshort)基本上仅适用于数组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 位 long 值的操作作为特殊情况实现)。

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

<小时/>

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com