Локальные переменные в 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? Для этого зарезервированы два слова?