точка байта и Short в Java (я прочитал другие вопросы)

#java #byte #short

#java #байт #короткое

Вопрос:

Мой вопрос таков: если я понял это правильно из разборки Java, когда я использую

 byte a=3,b=5;
System.out.println(a b);
  

на самом деле вместо byte использовалось бы int. Также все слоты локальной памяти имеют размер 4B, как и слоты стека. Я понимаю, что выделение массива байтов, вероятно, действовало бы более эффективно, но правда ли, что использование значения в один байт в конечном счете неэффективно? (Та же точка для краткости)

Комментарии:

1. Мой совет: используйте byte, когда вам нужно иметь дело с байтами . Используйте int, когда вам нужно иметь дело с числами . Они не совсем одинаковые.

Ответ №1:

является целочисленной операцией. вот почему

 byte c = a b; // compile error
  

вы должны использовать

 int c = a   b 
  

или

 byte c = (byte)(a b);
  

Мой совет — используйте int , чтобы не выполнять приведение каждый раз. Если вы всегда имеете дело с byte использованием byte, в противном случае используйте int

Комментарии:

1. Понятно, что я имел в виду System.out.println(a b);

Ответ №2:

Важно понимать, что в Java существование byte и short заключается в первую очередь не в том, чтобы иметь целочисленный тип данных с меньшим диапазоном. Почти во всех случаях, когда хранятся (достаточно маленькие) числовые значения, будет использоваться int , даже если допустимый диапазон равен всего 0-100.

byte и short используются, когда какой-либо внешний фактор ограничивает обрабатываемые данные этими диапазонами. Они просто существуют для упрощения взаимодействия с такими системами.

Например, файловые системы в наши дни хранят потоки байтов. Вы могли бы использовать int для всех этих операций чтения / записи, но наличие byte типа данных упрощает операцию и делает это различие явным.

Ответ №3:

Первым правилом настройки производительности должно быть написание простого, понятного кода.

В этом примере нет разницы в производительности, и даже если бы она была, println() выполняется в 10000 раз дольше, что делает какую-либо разницу незначительной.


То, как программа отображается в байт-коде, и то, как она отображается в машинном коде, отличаются.

Не все слоты в JVM состоят из 4 байт. например, ссылка на 64-разрядной машине может состоять из 8 байт, но она по-прежнему использует один «слот»

На вашем компьютере нет слотов. В нем есть регистры, которые обычно являются 32-разрядными или 64-разрядными.

В вашем примере используются операции с байтами, которые так же эффективны, как операции int, и могут привести к другому результату, поэтому они все еще требуются.

Примечание: объект с byte или short полями может быть меньше объекта с int полями.

В этом примере JVM может вычислять c один раз, поэтому ей не нужно a или b

Комментарии:

1. Таким образом, в принципе, несмотря на то, что на 64-разрядной машине int (как переменная Java) будет равен 4B, а указатель / ссылка будет равна 8B, виртуальная машина будет рассматривать их как атомарные локальные переменные. Это правильно?

2. @Джордж Пенн, Правильно. Однако, если вы используете -XX: UseCompressedOops 64-разрядную JVM, ссылки будут состоять из 4 байт вместо 8 байт. 😉

Ответ №4:

Объявите byte a=3,b=5; как final byte a=3,b=5; , чтобы, когда этот оператор byte c = a b; будет выполнен, он принимал byte not int .

Ответ №5:

Определите неэффективность.

Да, объем памяти может показаться неэффективным, но имейте в виду, что большинство процессоров сегодня 32-разрядные (или даже 64-разрядные). Сохранение байта всего в 8 битах потребует от процессора получения 32 бит адресного пространства и сдвига и очистки его, чтобы необходимые 8 бит были в нужном месте.

Комментарии:

1. Неэффективно в том смысле, что int был бы: а) быстрее б) более полезен в) с тем же объемом памяти Благодаря