java 字节码中的局部变量

2022-09-03 18:22:02

我正在尝试学习java字节码,我偶然发现了这一点:我编译了这个非常简单的代码,并提供了以下选项:-g

public class Test
{
 public static void main(String args[])
 {
  double a = 1.0;
  int b = (int)a;
 }
}

主代码原来是:

0 dconst_1
1 dstore_1
2 dload_1
3 d2i
4 istore_3
5 return

此外,main 的最大局部变量为 4,而 LocalVariableTable 只有 3 个条目(args、a、b)。我很想知道为什么编译器保留了4个局部变量,而显然只有3个,并且没有使用。我错过了什么吗?谢谢localvariable[2]


答案 1

它是 4,因为长和双在帧中占据 2 个连续的条目。这是由Java JVM规范明确指定的:

长整型或双精度型的值占据两个连续的局部变量。这样的值只能使用较小的索引来解决。例如,存储在索引 n 处的局部变量数组中的双精度类型的值实际上占用了索引为 n 和 n +1 的局部变量;但是,无法从中加载索引 n +1 处的局部变量。它可以存储进去。但是,这样做会使局部变量 n 的内容无效。


答案 2

我不知道Java字节码,这只是一个猜测:

这可能与事实是一个?是否为它保留了两个字?adouble


推荐