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]没有被使用。有什么我想念的吗?谢谢

4

2 回答 2

25

它是 4,因为 long 和 double 在帧中占据了 2 个连续的条目。Java JVM 规范明确规定了这一点:

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

于 2009-11-21T09:27:33.673 回答
4

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

这可能与aa的事实有关double吗?是不是要为它保留两个字?

于 2009-11-21T09:22:26.430 回答