Java中的字节和短点(我已经阅读了其他问题)
Posted
技术标签:
【中文标题】Java中的字节和短点(我已经阅读了其他问题)【英文标题】:point of Byte and Short in Java (I've read the other questions) 【发布时间】:2011-04-14 11:43:21 【问题描述】:我的问题是: 如果我从 Java 反汇编中得到它,当我使用时
byte a=3,b=5;
System.out.println(a+b);
实际上会使用 int 而不是 byte。此外,所有本地内存插槽都是 4B,就像堆栈插槽一样。我意识到分配一个字节数组可能会更有效,但是使用单个字节值最终是低效的吗? (简称同点)
【问题讨论】:
我的建议:当你需要处理 bytes 时使用 byte。当您需要处理 数字 时使用 int。它们并不完全相同。 【参考方案1】:+
是整数运算。这就是为什么
byte c = a+b; // compile error
你应该使用
int c = a + b
或
byte c = (byte)(a+b);
我的建议是使用int
,以免每次都投射。如果你总是处理byte
,使用字节,否则使用int
【讨论】:
点了,我的意思是 System.out.println(a+b);【参考方案2】:重要的是要认识到,在 Java 中,byte
和 short
的存在主要不是为了具有较小范围的整数数据类型。在几乎所有存储(足够小的)数值的情况下,将使用int
,即使有效范围仅为 0-100。
byte
和short
在某些外部因素 将要处理的数据限制在这些范围内时使用。它们的存在只是为了简化与此类系统的交互。
例如,如今的文件系统存储字节流。您可以将int
用于所有这些读/写操作,但使用byte
数据类型可以简化操作并明确区分。
【讨论】:
【参考方案3】:性能调优的第一条规则应该是编写简单、清晰的代码。
在此示例中,没有性能差异,即使 println() 需要 10,000 倍的时间,也不会产生任何差异。
程序在字节码中的显示方式与在本机代码中的显示方式不同。
在 JVM 中,并非所有插槽都是 4 字节。例如64 位机器上的引用可以是 8 字节,但它仍然使用一个“插槽”
您的机器没有插槽。它确实具有通常为 32 位或 64 位的寄存器。
在您的示例中,使用了字节操作,它与 int 操作一样有效,并且可以产生不同的结果,因此仍然需要它们。
注意:带有byte
或short
字段的对象可以小于带有int
字段的对象。
在这个例子中,JVM 可以计算一次c
,所以它不需要a
或b
【讨论】:
所以基本上尽管在 64 位机器上 int(作为 Java 变量)将是 4B 并且指针/引用将是 8B,但 VM 会将它们都视为原子局部变量。这是正确的吗? @George Penn,正确。但是,如果您在 64 位 JVM 上使用-XX:+UseCompressedOops
,则引用将是 4 字节而不是 8 字节。 ;)【参考方案4】:
将byte a=3,b=5;
声明为final byte a=3,b=5;
,这样当该语句byte c = a+b;
将被执行时,它将采用byte
而不是int
。
【讨论】:
【参考方案5】:定义低效。
是的,内存占用似乎效率低下,但请记住,当今的大多数处理器都是 32 位(甚至是 64 位)。仅以 8 位存储一个字节需要处理器获取 32 位地址空间并对其进行移位和清理,以便将必要的 8 位放在正确的位置。
【讨论】:
从某种意义上说 int 效率低下:a) 更快 b) 更多用途 c) 相同的内存占用 谢谢以上是关于Java中的字节和短点(我已经阅读了其他问题)的主要内容,如果未能解决你的问题,请参考以下文章