#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 был бы: а) быстрее б) более полезен в) с тем же объемом памяти Благодаря