2

我的问题是:如果我从 Java 反汇编中得到它,当我使用

byte a=3,b=5;
System.out.println(a+b);

实际上会使用 int 而不是 byte。此外,所有本地内存插槽都是 4B,就像堆栈插槽一样。我意识到分配一个字节数组可能会更有效,但是使用单个字节值最终是低效的吗?(简称同点)

4

5 回答 5

2

+是整数运算。因此

byte c = a+b; // compile error

你应该使用

int c = a + b 

或者

byte c = (byte)(a+b);

我的建议是使用int,以免每次都施放。如果你总是处理byte使用字节,否则使用int

于 2011-04-14T11:47:56.863 回答
2

重要的是要意识到在 Java 中存在byte并且short主要不是具有较小范围的整数数据类型。在几乎所有存储(足够小的)数值的情况下,int都会使用 an,即使有效范围仅为 0-100。

byte并且short某些外部因素将要处理的数据限制在这些范围内时使用。它们只是为了简化与此类系统的交互而存在。

例如,如今的文件系统存储字节流。您可以使用int所有这些读/写操作,但是拥有byte数据类型可以简化操作并使这种区别变得明确。

于 2011-04-14T11:53:16.543 回答
1

性能调优的第一条规则应该是编写简单、清晰的代码。

在此示例中,没有性能差异,即使 println() 需要 10,000 倍的时间,也不会产生任何差异。


程序在字节码中的出现方式和在本机代码中的出现方式是不同的。

在 JVM 中,并非所有插槽都是 4 字节。例如,64 位机器上的引用可以是 8 字节,但它仍然使用一个“插槽”

您的机器没有插槽。它确实具有通常为 32 位或 64 位的寄存器。

在您的示例中,使用了字节操作,它与 int 操作一样有效,并且可以产生不同的结果,因此仍然需要它们。

注意:带有byteshort字段的对象可以小于带有int字段的对象。

在这个例子中,JVM 可以计算c一次,所以它不需要ab

于 2011-04-14T11:51:05.553 回答
0

声明byte a=3,b=5;这样final byte a=3,b=5;当这个语句byte c = a+b;将被执行时它不会被byte执行int

于 2011-04-14T11:51:24.067 回答
0

定义低效。

是的,内存占用似乎效率低下,但请记住,当今的大多数处理器都是 32 位(甚至是 64 位)。仅以 8 位存储一个字节将需要处理器获取 32 位地址空间并对其进行移位和清理,以便将必要的 8 位放在正确的位置。

于 2011-04-14T11:56:40.457 回答