Думаете экономите память, храня данные в переменных типа byte или short? Ха-ха!

 

Сижу я значит, разбираюсь в коде алгоритма Base64, пытаясь понять что за магические манипуляции с битами происходят. Замечаю очень странный момент: Прежде, чем выполнять какие-либо операции, типа сдвигов и всего такого, все байты кастуются в Int. Черт возьми! Что за фигня еще??? Они только что превратили 8 бит в 32.

Почему Java использует int вместо byte или short.

Для начала разберемся как адресуется память в процессоре. ЦПУ основаны на регистрах и шинах. Регистр - это блок ячеек памяти, занимающий соответственно 32 или 64 бита. Ячейки памяти в свою очередь занимают количество бит, кратное степени двойки от 8 до 64. Не так просто, как говорят на уроках информатики о списке нулей и единиц.

Изначально Java была спроектирована для работы на 32 битных процессорах, следовательно, любая ячейка памяти будет занимать ровно 4 байта, прямо как количество памяти отведенное на int.

byte и short будут занимать ровно то же пространство, что и int, если это:

  • Локальная переменная (Объявленная в методе или конструкторе)
  • Переменная класса (Статическая переменная)
  • Переменная экземпляра (Объявленная в классе, но за пределами методов или конструктора)

Почему? Потому что в большинстве компьютерных систем адреса переменных выровнены. Например, если вы используете 1 байт, по факту будете получать 4 в памяти. Первый справа, тот самый и 3 для отступа.

А что если я положу ее в массив?

Тут, byte будет занимать точно 1 байт, а short 2 байта. Потому что в массивах дает нам ссылку на конкретный участок в памяти, имеющий начало и конец, которые будут выровнены.