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

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

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

 short a; int b; 

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

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

这在JVMS的第2.11.1节中有解释:

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

因此这是合理的:

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

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

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

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