java字节码中的if条件反转

2023-11-27

考虑简单的例子

private static String isPositive(int val) {
    if (val > 0) {
        return "yes";
    } else {
        return "no";
    }
}

这非常简单:如果val > 0 return yes否则返回no。 但编译后,在字节码中,这个 if 条件相反:

  private static isPositive(I)Ljava/lang/String;
   L0
    LINENUMBER 12 L0
    ILOAD 0
    IFLE L1
   L2
    LINENUMBER 13 L2
    LDC "yes"
    ARETURN
   L1
    LINENUMBER 15 L1
   FRAME SAME
    LDC "no"
    ARETURN

它检查:如果val <= 0然后返回no,否则返回yes.

首先,我认为<=check 更便宜,而且是某种优化。但是如果我将初始代码更改为

if (val <= 0) {
    return "no";
} else {
    return "yes";
}

它仍然会在字节码中被反转:

   L0
    LINENUMBER 12 L0
    ILOAD 0
    IFGT L1
   L2
    LINENUMBER 13 L2
    LDC "no"
    ARETURN
   L1
    LINENUMBER 15 L1
   FRAME SAME
    LDC "yes"
    ARETURN

那么,这种行为是有原因的吗?可以改成直接的吗?


可能是这样完成的,以便中的两个代码块if在翻译后的字节码中以相同的顺序显示。

例如,这段 Java 代码:

if (val > 0) {
    return "yes";
} else {
    return "no";
}

翻译成这样(伪代码):

If val <= 0, then branch to L1
return "yes"
L1:
return "no"  

请注意,在原始 Java 代码中,if检查条件以查看是否应运行第一个代码块,而在翻译后的字节码中,将进行检查以查看是否应采用分支(跳过第一个代码块)。所以它需要检查补充条件。

可以改成直接的吗?

当然,也可以保留条件,但是您需要颠倒两个代码块的顺序:

If val > 0, then branch to L1
return "no"
L1:
return "yes"  

不过,我不会说这个版本比前一个版本“更直接”。

无论如何,你为什么要改变它?两个版本都应该没问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java字节码中的if条件反转 的相关文章

随机推荐