Java bytecode - представление типов, меньших, чем int

В одном из проектов в моем университете я напрямую работаю с Java-байт-кодом.

После просмотра списка инструкций, доступных для JVM (http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings), я увидел, что для хранения не существует [b|c|s]store, только istore целые числа в локальной переменной. Означает ли это, что если в моей программе я пишу:

short a;
int b;

Я не сохраняю память, потому что каждая локальная переменная занимает 4 байта?

Мне всегда казалось, что использование типов short или byte будет сохранять некоторую память во время выполнения.

Ответы

Ответ 1

Это объясняется в разделе 2.11.1 JVMS:

Обратите внимание, что большинство инструкций [...] не имеют форм для интегральных типов byte, char и short. Ни у кого нет форм для типа boolean. Компилятор кодирует нагрузки литеральных значений типов byte и short с помощью инструкций Java Virtual Machine, которые подписывают эти значения до значений типа int во время компиляции или времени выполнения. [...] Таким образом, большинство операций над значениями фактических типов boolean, byte, char и short корректно выполняются инструкциями, действующими на значения вычислительного типа int.

Таким образом, это оправдано:

Учитывая размер байта одного байта Java Virtual Machine, типы кодирования в opcodes оказывают давление на дизайн его набора команд. Если каждая типизированная команда поддерживает все типы данных во время выполнения Java Virtual Machine, будет больше инструкций, чем может быть представлено в байте. Вместо этого набор команд виртуальной машины Java обеспечивает уменьшенный уровень поддержки типов для определенных операций. Другими словами, набор команд намеренно не ортогонален. Отдельные инструкции могут использоваться для преобразования между неподдерживаемыми и поддерживаемыми типами данных по мере необходимости.

Однако, хотя это относится к загрузке/хранению переменных стека, оно не применяется для загрузки/хранения в примитивных массивах; есть коды операций для всех примитивных типов.

Ответ 2

Вы не сохраняете память с помощью локального int vs long, поскольку они, вероятно, будут в 64-разрядных регистрах. Примечание: как выставляется код байта и как выполняется код на самом деле, это не то же самое.

Сохранение двух байтов не важно ни на одном новом оборудовании. Значение 2 байта меньше 1/1000 времени, когда вам требуется мигать, даже если вы на минимальной зарплате.