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

And*_*dna 18 java jvm bytecode

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

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

short a;
int b;
Run Code Online (Sandbox Code Playgroud)

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

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

Oli*_*rth 14

在JVMS的2.11.1节中有解释:

请注意,大多数指令[...]没有为整型形式byte,charshort.没有boolean类型的表格.编译器对类型的文字值进行加载,byteshort使用Java虚拟机指令int在编译时或运行时将这些值签名扩展为类型的值.[...]因此,实际的类型的值的大多数操作boolean,byte,char,和short正确地通过在计算类型的值操作说明进行int.

因此这是合理的:

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

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