Локальные переменные в java-байт-коде
Я пытаюсь изучить 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
Кроме того, основные максимальные локальные переменные равны 4, а LocalVariableTable имеет только 3 записи (args, a, b). Мне любопытно узнать, почему компилятор зарезервировал 4 локальные переменные, в то время как явно только 3, а localvariable[2]
не используется. Есть что-то, что мне не хватает? Спасибо вам
Ответы
Ответ 1
это 4, потому что long и double занимают 2 последовательные записи в кадре. Это четко указано в Java JVM спецификации:
Значение типа long или type double занимает два последовательных локальных переменные. Такое значение может быть с использованием меньшего индекса. Для Например, значение типа double сохраняется в локальном переменном массиве с индексом n фактически занимает локальные переменные с индексами n и n +1; Однако локальная переменная с индексом n +1 не может быть загружен из. Его можно хранить. Однако это делает недействительным содержимое локальной переменной n.
Ответ 2
Я не знаю байт-кода Java, это просто догадка:
Может ли это быть связано с тем, что a
является double
? Для этого зарезервированы два слова?