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 }
如图所示,
const指令表示将数据推送至栈顶,但是const的范围非常小,仅包括:
int: -1 ~ 5 , long , double: 0 ~ 1 , float: 0 ~ 2
对于更大的数,则是采用bipush , sipush , idc指令进行操作。这么做的原因是为什么?
一开始想的是操作更少位的寄存器比如从RAX改为EAX甚至更小的寄存器。后来查看汇编的时候发现iconst操作的还是RAX,所以字节码区分iconst,bipush , sipush , idc的意义是什么?具体好处在哪?
有没有老哥给解答一下,不胜感激!
iconst,bipush , sipush , ldc 这些指令是定义的取值范围使用哪些指令;例如你上大学之后,学校给的学号一般都是年开头的,这样老师看到你的学号就知道你是哪一年入学的,就知道你的大概范围;然后不同的系别,也有给到不同的编号,就知道你是哪个系的;