2013-06-13 7 views
17

В одном из проектов моего университета я работаю напрямую с Java-байт-кодом.java bytecode - представление типов меньше, чем int

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

short a; 
int b; 

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

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

+2

Звучит правильно. Однако вы все равно получаете сбережения, используя 'byte []' s. –

ответ

13

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

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

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

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

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

3

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

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

+0

Я знаю, что я не сохраню значительную память, мне просто было интересно узнать об этом случае. – Andna

+0

Хотя, если у вас есть миллиарды сбережений в 2 байта, это может стать более интересным ... Но я согласен, обычно не имеет смысла тратить время на размышления о нескольких байтах в современных системах. – brimborium

+0

Да, но во встроенной среде эти байты могут/будут складываться, что делает это важным. – SnakeDoc

Смежные вопросы