Java字节码中的局部变量

14

我正试图学习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]未被使用。我是否遗漏了什么?谢谢

2个回答

25

这是因为在堆栈中,long 和 double 类型占用连续两个条目。这在Java JVM规范中有明确说明:

long 和 double 类型的值占用两个连续的本地变量。只能使用较小的索引来寻址此类值。例如,在索引 n 处存储的 double 类型的值实际上占用索引 n 和 n +1 的本地变量;然而,无法从索引 n+1 加载本地变量。可以将值存储到该位置,但这样会使本地变量 n 的内容无效。


4

我不了解Java字节码,这只是一个猜测:

可能与adouble类型有关吗?是否为其保留了两个字?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接