GM_kring 2022-07-07 15:14 采纳率: 0%
浏览 59
已结题

对于将Int型常量压栈的字节码的一些疑问

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 ~ 5long , double: 0 ~ 1 , float: 0 ~ 2

对于更大的数,则是采用bipush , sipush , idc指令进行操作。这么做的原因是为什么?

一开始想的是操作更少位的寄存器比如从RAX改为EAX甚至更小的寄存器。后来查看汇编的时候发现iconst操作的还是RAX,所以字节码区分iconst,bipush , sipush , idc的意义是什么?具体好处在哪?

  • 写回答

3条回答 默认 最新

  • GM_kring 2022-07-08 09:35
    关注

    有没有老哥给解答一下,不胜感激!

    评论

报告相同问题?

问题事件

  • 系统已结题 7月15日
  • 赞助了问题酬金10元 7月7日
  • 创建了问题 7月7日