gpt4 book ai didi

java - 为什么在 Java 字节码中跳转而不是返回?

转载 作者:行者123 更新时间:2023-12-02 16:04:25 25 4
gpt4 key购买 nike

背景

我编译的方法如下:

public static final boolean equalTo(final int x, final int y) {
return x == y;
}

并且使用 javap 可以看到为它生成了以下字节码:

  public static final boolean equalTo(int, int);                                                                                                                                                                 
descriptor: (II)Z
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
Code:
stack=2, locals=2, args_size=2
0: iload_0
1: iload_1
2: if_icmpne 9
5: iconst_1
6: goto 10
9: iconst_0
10: ireturn
LineNumberTable:
line 72: 0
StackMapTable: number_of_entries = 2
frame_type = 9 /* same */
frame_type = 64 /* same_locals_1_stack_item */
stack = [ int ]

我写了ASM这将创建相同的字节码,并通过将 goto 10 更改为 ireturn 来创建另一个表现相同的版本。它可以忽略不计,但这也减少了 StackMapTable 的大小,因为它消除了跳转。

问题

我知道“它只是字节码”并不能指示机器将要做什么,但是为什么编译器在它可以简单地发出 ireturn 时发出 goto 10

最佳答案

前端编译器使用简单的模式生成代码,并且它们依靠优化过程来清理代码。在生成 x == y 表达式时,编译器“不知道”接下来是 return 语句。它可能会对此进行检查,但可以使用某种窥孔优化器同样轻松地处理这个额外的步骤。

窥孔优化器的好处是它可以执行级联优化,也就是说,一个优化的结果可以输入到下一个优化中。生成 x == y 表达式的代码实际上没有任何方法可以在不增加复杂性的情况下执行不止一个优化步骤。

Java 编译器曾经有一个优化功能,但是为了支持 HotSpot 而放弃了这个功能,它可以执行更强大的优化。在 Java 编译器中执行优化会减慢它的速度,并且不会真正改善很多东西。

关于java - 为什么在 Java 字节码中跳转而不是返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69813756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com