java字节码中的局部变量

时间:2009-11-21 09:12:40

标签: java bytecode

我正在尝试学习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 个答案:

答案 0 :(得分:25)

它是4,因为long和double占用了帧中的2个连续条目。这由Java JVM specification明确指定:

  

long或double类型的值   连续两次占据当地   变量。这样的价值可能只是   使用较小的索引解决。对于   例如,存储类型double的值   在索引n的局部变量数组中   实际上占用了局部变量   索引n和n + 1;然而   索引n + 1处的局部变量不能   装载自。它可以存储到。   但是,这样做会使   局部变量的内容n。

答案 1 :(得分:4)

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

这可能与adouble的事实有关吗?有两个词是为它保留的吗?