java字节码 - 小于int的类型的表示

时间:2013-06-13 18:44:48

标签: java jvm bytecode

在我大学的一个项目中,我直接使用Java字节码。

在浏览了可用于JVM的指令列表(http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings)后,我发现只有[b|c|s]store, istore这样的东西才能将整数存储在局部变量中。这是否意味着如果在我的程序中我写道:

short a;
int b;

我没有保存任何内存,因为每个局部变量条目占用4个字节?

我一直认为使用shortbyte类型会在运行时节省一些内存。

2 个答案:

答案 0 :(得分:14)

2.11.1 of the JVMS

部分对此进行了解释
  

请注意,大多数说明 [...] 没有整数类型bytecharshort的表单。没有boolean类型的表单。编译器使用Java虚拟机指令对类型byteshort的文字值进行加载,这些指令在编译时或运行时将这些值签名扩展为类型int的值。 [...] 因此,对实际类型booleanbytecharshort的值的大多数操作均由指令正确执行对计算类型int的值进行操作。

这是合理的:

  

鉴于Java虚拟机的单字节操作码大小,将编码类型编码到操作码中会对其指令集的设计造成压力。如果每个类型化指令都支持所有Java虚拟机的运行时数据类型,则会有更多指令,而不是在一个字节中表示。相反,Java虚拟机的指令集为某些操作提供了降低级别的类型支持。换句话说,指令集故意不正交。如有必要,可以使用单独的指令在不受支持和支持的数据类型之间进行转换。

然而,虽然这适用于堆栈变量的加载/存储,但它不适用于加载/存储到基本数组中;所有原始类型都有操作码。

答案 1 :(得分:3)

您没有使用本地int vs long保存任何内存,因为这些内存可能位于64位寄存器中。注意:字节代码的布局方式以及代码的实际运行方式并不相同。

在任何新硬件上保存两个字节并不重要。即使您处于最低工资水平,2字节的值也不到1/1000。