在我大学的一个项目中,我直接使用 Java 字节码。
浏览 JVM 可用指令列表后(http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings)我看到没有这样的东西[b|c|s]store,
only istore
用于将整数存储在局部变量中。这是否意味着如果在我的程序中我写:
short a;
int b;
我没有节省任何内存,因为每个局部变量条目占用 4 个字节?
我一直觉得使用short
or byte
类型会在运行时节省一些内存。
这在部分中进行了解释2.11.1 JVMS http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.11.1:
请注意,大多数指令[...]没有整数类型的形式byte
, char
, and short
。没有人有表格boolean
类型。编译器对大量类型的文字值进行编码byte
and short
使用 Java 虚拟机指令将这些值符号扩展为 type 的值int
在编译时或运行时。[...]因此,大多数对实际类型值的操作boolean
, byte
, char
, and short
由对计算类型的值进行操作的指令正确执行int
.
其理由如下:
鉴于 Java 虚拟机的一字节操作码大小,将类型编码为操作码对其指令集的设计带来了压力。如果每个类型化指令都支持 Java 虚拟机的所有运行时数据类型,那么指令的数量就会多于一个字节所能表示的数量。相反,Java 虚拟机的指令集为某些操作提供了降低级别的类型支持。换句话说,指令集是故意不正交的。根据需要,可以使用单独的指令在不支持和支持的数据类型之间进行转换。
然而,虽然这适用于堆栈变量的加载/存储,但它不适用于加载/存储到原始数组中;所有原始类型都有操作码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)