0

我最近一直在学习 java 字节码,并且我已经理解了其中的大部分内容,但是我对如何计算局部变量计数感到困惑。我以为这只是局部变量的总和,但是在查看字节码时,这段代码会生成 1 个局部变量

public int testFail()
{
    return 1;
}

但我认为它应该是零局部变量,因为没有定义局部变量。

此外,此方法还生成一个局部变量,但它比上一个示例具有更多的局部变量。

最后这个方法

public static int testFail(int a, int b)
{
    return a+b;
}

在字节码中生成两个局部变量。

public static int testFail(int a)
{
    return a;
}
4

2 回答 2

1

非静态方法使用局部变量槽this。另一个复杂因素是longs 和doubles 分别算作 2。此外,根据您的编译器和设置,您可能看不到源代码中的局部变量和字节码中的局部变量之间的一对一映射。例如,如果调试信息被遗漏,编译器可能会消除不必要的局部变量。

编辑:

我只记得:编译器也可以重用局部变量槽。例如,给定以下代码:

public static void test() {
    for(int i = 0; i < 100; i++) {
        ...
    }
    for(int j = 0; j < 100; j++) {
    }
}

可以使用相同的插槽ij因为它们的范围不重叠。

于 2013-06-28T15:22:59.980 回答
0

第一个有局部变量的原因是因为它是一个非静态方法,所以有一个隐式this参数。

于 2013-06-28T14:26:07.150 回答