在我大学的一个项目中,我直接使用Java字节码。
在浏览了可用于JVM的指令列表(http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings)后,我发现只有[b|c|s]store,
istore
这样的东西才能将整数存储在局部变量中。这是否意味着如果在我的程序中我写道:
short a;
int b;
我没有保存任何内存,因为每个局部变量条目占用4个字节?
我一直认为使用short
或byte
类型会在运行时节省一些内存。
答案 0 :(得分:14)
请注意,大多数说明 [...] 没有整数类型
byte
,char
和short
的表单。没有boolean
类型的表单。编译器使用Java虚拟机指令对类型byte
和short
的文字值进行加载,这些指令在编译时或运行时将这些值签名扩展为类型int
的值。 [...] 因此,对实际类型boolean
,byte
,char
和short
的值的大多数操作均由指令正确执行对计算类型int
的值进行操作。
这是合理的:
鉴于Java虚拟机的单字节操作码大小,将编码类型编码到操作码中会对其指令集的设计造成压力。如果每个类型化指令都支持所有Java虚拟机的运行时数据类型,则会有更多指令,而不是在一个字节中表示。相反,Java虚拟机的指令集为某些操作提供了降低级别的类型支持。换句话说,指令集故意不正交。如有必要,可以使用单独的指令在不受支持和支持的数据类型之间进行转换。
然而,虽然这适用于堆栈变量的加载/存储,但它不适用于加载/存储到基本数组中;所有原始类型都有操作码。
答案 1 :(得分:3)
您没有使用本地int
vs long
保存任何内存,因为这些内存可能位于64位寄存器中。注意:字节代码的布局方式以及代码的实际运行方式并不相同。
在任何新硬件上保存两个字节并不重要。即使您处于最低工资水平,2字节的值也不到1/1000。