1.1给出如下代码片段:
1 public static void main(String[] args) {
2 int i = 5;
3 int j = -1;
4 }
其转换为字节码为:
1 public static void main(java.lang.String[]);
2 Code:
3 0: iconst_5
4 1: istore_1
5 2: iconst_m1
6 3: istore_2
7 4: return
8 }
如图所示,
1.1.1 iconst_5
const指令表示将数据推送至栈顶,但是const的范围非常小,仅包括:
int: -1 ~ 5 , long , double: 0 ~ 1 , float: 0 ~ 2
对于更大的数,则是采用bipush , sipush , idc指令进行操作。这么做的原因是为什么?
一开始想的是操作更少位的寄存器比如从RAX改为EAX甚至更小的寄存器。后来查看汇编的时候发现iconst操作的还是RAX,所以字节码区分iconst,bipush , sipush , idc的意义是什么?具体好处在哪?