2009-11-21 173 views
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]未使用。有什么我失踪?谢谢

回答

24

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

类型的值或长型双 占用两个连续的局部 变量。这样的值可能只有 使用较小的索引编址。例如,对于 示例,索引为n 的局部变量数组中存储的类型为 的值实际上占据了具有索引n和n + 1的局部变量 ;但是,位于索引n +1的局部变量 不能从 加载。它可以存储进去。 但是,这样做会使局部变量n的内容 无效。

4

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

它可能与事实adouble办?两个单词是为它保留的吗?