Размер типа boolean

357
10 февраля 2017, 03:15

Для всех примитивных типов данных, кроме типа boolean, в Java однозначно определен размер.

Размер типа boolean, насколько я понимаю, зависит от реализации конкретной виртуальной машины.

Вопрос: почему для типа boolean однозначно не определили размер?

Answer 1
А зачем? Языку не должно быть до этого дела.

Если поведение однозначно определено, всё остальное вторично.

Тип boolean прекрасно определяется множеством своих допустимых значений. Математически оно ограничивает минимальный размер значения одним битом.

Но использовать именно один бит (и ни битом более) эффективно далеко не всегда, поскольку на популярных архитектурах нельзя адресовать отдельные биты. А потому значения отдельных boolean'ов нельзя быстро сохранить в отдельные биты оперативной памяти — необходимо использовать комбинацию побитовых операций, что почти наверняка будет медленнее, чем запись целого отдельного регистра в оперативную память (размер которого может быть различным на разных платформах!).

Но при этом, к примеру, я вполне себе представляю, как на x86 компилятор может использовать в нативном коде в качестве какого-нибудь конкретного boolean-значения один бит регистра флагов, при условии, что это значение никогда не попадает в оперативную память (отдельно от других). Поэтому любые ограничения на размер более одного бита тоже могут потенциально мешать.

И эта свобода представления позволяет авторам виртуальных машин Java использовать любые реализации, которые они считают наиболее эффективными в каждом конкретном контексте. Как видно из примеров выше, любые ограничения будут только мешать.

Answer 2

Как Вы сказали, все зависит от определенной реализации JVM и почему — не знаю и ответа, когда искал, тоже не нашел. Однако, вот информация, которая все же может помочь (брал тут):

В стандартной реализации Sun JVM и Oracle HotSpot JVM тип boolean занимает 4 байта (32 бита), как и тип int. Однако, в определенных версия JVM имеются реализации, где в массиве boolean каждое значение занимает по 1-му биту.

Также есть библиотеки для уменьшения размера boolean: BitSet и OpenBitSet (от Apache). Дословная цитата с Хабра:

Спасением в таких случаях будет класс BitSet, который ведёт себя подобно массиву boolean, но упаковывает данные так, что для одного бита выделяется всего один бит памяти (с небольшими издержками для всего массива). BitSet хранит внутри себя массив типа long, а при запросе или установке значения определенного бита — высчитывает индекс нужного long и пользуясь побитовыми операциями и операциями сдвига производит вычисления над единственным битом. Существует еще более интересная реализация BitSet, OpenBitSet — Apache реализация, которая используется для Lucene. Она гораздо быстрее, но упускает некоторые проверки, проводимые в оригинальном BitSet. Что использовать — решать Вам.

Answer 3

Да, вы действительно правы. Спецификация JVM - не определяет размер типа boolean:

Although the Java Virtual Machine defines a boolean type, it only provides very limited support for it. There are no Java Virtual Machine instructions solely dedicated to operations on boolean values. Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java Virtual Machine int data type.

В первой версии спецификации JVM созданной святым James Gosling - boolean вообще отсутствовал как тип:

Although Java defines a boolean type, the Java Virtual Machine does not have instructions dedicated to operations on boolean values. Instead, a Java expression that operates on boolean values is compiled to use the int data type to represent boolean variables.

Я полагаю, что это сделано как баланс между скоростью и удобством. То есть одиночный тип boolean рассматривается как int, а массив, рассматривается как массив byte, а кое где и вовсе как бит

READ ALSO
Передача данных в новую форму JavaFX

Передача данных в новую форму JavaFX

Доброго времени суток! Столкнулся с вопросом передачи необходимых данных в новую формуРаньше тоже сталкивался с таким но я тогда сделал...

346
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space при сканировании большого количества папок

Exception in thread “main” java.lang.OutOfMemoryError: Java heap space при сканировании большого количества папок

Пытаюсь выполнить сканирование проекта, на предмет поиска в нем файлов содержащих слово заглушкаФайлы в кодировке UTF-16

298
Создание REST API Java EE

Создание REST API Java EE

Дано: встала задача написания простенького REST API, состоящего буквально из нескольких методовНа вход подаем несколько параметров, на выходе...

449
Возвращение данных по нажатию кнопки в другом классе

Возвращение данных по нажатию кнопки в другом классе

У меня есть адаптер ListView где по нажатию на элемент я хочу показать диалогДля этого я создал класс который показывает диалог с кнопкой

300