我正在尝试学习java字节码,我偶然发现:我使用-g选项编译了这个非常简单的代码:
public class Test
{
public static void main(String args[])
{
double a = 1.0;
int b = (int)a;
}
}
Run Code Online (Sandbox Code Playgroud)
主要代码原来是:
0 dconst_1
1 dstore_1
2 dload_1
3 d2i
4 istore_3
5 return
Run Code Online (Sandbox Code Playgroud)
此外,main的最大局部变量为4,LocalVariableTable只有3个条目(args,a,b).我很想知道为什么编译器保留4个局部变量,而显然只有3个,并且localvariable[2]没有使用.有什么我想念的吗?谢谢
dfa*_*dfa 25
它是4,因为long和double占用了帧中的2个连续条目.Java JVM规范明确规定了这一点:
long类型或double类型的值占用两个连续的局部变量.只能使用较小的索引来处理这样的值.例如,存储在索引n的局部变量数组中的double类型的值实际上占用索引为n和n + 1的局部变量; 但是,无法加载索引n +1处的局部变量.它可以存储到.但是,这样做会使局部变量n的内容无效.
| 归档时间: |
|
| 查看次数: |
3356 次 |
| 最近记录: |