Действительный непригодными для постоянного индекса бассейн


Я могу прочитать в документации JVM следующее:

Все 8-байтовые константы занимают две записи в таблице constant_pool файла класса. Если структура CONSTANT_Long_info или CONSTANT_Double_info является элементом в таблице constant_pool с индексом n, то следующий полезный элемент в пуле находится в индексе n+2. Индекс constant_pool n+1 должен быть допустимым, но считается непригодным для использования.

В ретроспективе, делая 8-байтные константы принимают две записи постоянного пула был бедный выбор.

Если индекс n+1 допустим, то как он может быть "непригодным"? Кроме того, он не кажется полностью непригодным для использования, так как в нем можно хранить значение:

Значение типа long или типа double занимает две последовательные локальные переменные. Такое значение может быть рассмотрено только с использованием меньшего индекса. Например, значение типа double, хранящееся в массиве локальных переменных с индексом n, фактически занимает локальные переменные с индексами n и n+1; однако, локальная переменная с индексом n+1 не может быть загружена из. Его можно хранить внутри. Однако это делает недействительным содержимое локальной переменной n.

Означает ли это, что" допустимо " = "вы можете хранить в нем", а" непригодно " = "вы не можете загрузить его"?

1 2

1 ответ:

Вы смешиваете пул констант и локальные переменные.

Первая цитата говорит о постоянном пуле, который, как следует из названия, является постоянным. Вы не можете хранить в постоянном пуле. Фраза "индекс constant_pool n+1 должен быть допустимым " подразумевает, например, что если последняя запись пула является константой long или double, вам все равно придется объявить пул достаточно большим, чтобы вместить обе записи, хотя вторая не используется. Я не знаю никакого другого практического способа. следовательно, это в основном формальное утверждение, подразумевающее, что существует непрерывный диапазон допустимых индексов, хотя некоторые из них не могут быть прочитаны. Локальные переменные, о которых идет речь в вашей второй цитате, - это совсем другое дело. Локальные переменные могут быть записаны, и записываемое значение не обязательно должно быть того же типа, что и предыдущее, единственное требование состоит в том, чтобы последующие чтения соответствовали текущему типу переменной, то есть самому последнему записанному значению. Так что вы можете написать в индекс n +1 даже тогда, когда ранее было значение типа long или double в n, хотя это означает, что нет никакого действительного значения в n впоследствии, только новое значение в n+1.