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

2022-09-02 13:31:48

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

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

short a;
int b;

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

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


答案 1

这在 JVMS 的 2.11.1 节中进行了解释:

请注意,大多数指令 [...] 没有整数类型 、 、 和 的形式。没有一个具有该类型的形式。编译器对类型的文本值的负载进行编码,并使用 Java 虚拟机指令将这些值签名扩展为编译时或运行时的类型值。[...]因此,对实际类型 、 、 和 的值的大多数操作都是由对计算类型的值进行操作的指令正确执行的。bytecharshortbooleanbyteshortintbooleanbytecharshortint

因此,它是合理的:

考虑到 Java 虚拟机的单字节操作码大小,将类型编码为操作码会给其指令集的设计带来压力。如果每个类型化指令都支持 Java 虚拟机的所有运行时数据类型,则指令将超过一个字节所能表示的指令。相反,Java 虚拟机的指令集为某些操作提供了较低级别的类型支持。换句话说,指令集故意不正交。根据需要,可以使用单独的指令在不受支持的数据类型和受支持的数据类型之间进行转换。

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


答案 2

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

在任何新硬件上,节省两个字节都不重要。2字节的值小于1/1000,即使您处于最低工资状态,您也要眨眼所需的时间。


推荐