19

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

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

short a;
int b;

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

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

4

2 回答 2

16

JVMS的第 2.11.1 节对此进行了解释:

请注意,大多数指令[...]没有整数类型bytecharshort. 没有一个boolean类型的表格。编译器对大量类型的文字值进行编码,byte并使用 Java 虚拟机指令在编译时或运行时short将这些值符号扩展为类型值。[...]因此,对实际类型、、和的值的大多数操作都是由对计算类型的值进行操作的指令正确执行的。intbooleanbytecharshortint

这是有道理的:

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

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

于 2013-06-13T18:51:34.537 回答
3

您没有使用本地intvs保存任何内存,long因为它们可能位于 64 位寄存器中。注意:字节码的布局方式和代码的实际运行方式是不一样的。

在任何新硬件上保存两个字节并不重要。2 个字节的值小于你眨眼时间的 1/1000,即使你是最低工资。

于 2013-06-13T18:54:10.023 回答