Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Размер типа boolean

#java


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

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

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


Ответы

Ответ 1



А зачем? Языку не должно быть до этого дела. Если поведение однозначно определено, всё остальное вторично. Тип boolean прекрасно определяется множеством своих допустимых значений. Математически оно ограничивает минимальный размер значения одним битом. Но использовать именно один бит (и ни битом более) эффективно далеко не всегда, поскольку на популярных архитектурах нельзя адресовать отдельные биты. А потому значения отдельных boolean'ов нельзя быстро сохранить в отдельные биты оперативной памяти — необходимо использовать комбинацию побитовых операций, что почти наверняка будет медленнее, чем запись целого отдельного регистра в оперативную память (размер которого может быть различным на разных платформах!). Но при этом, к примеру, я вполне себе представляю, как на x86 компилятор может использовать в нативном коде в качестве какого-нибудь конкретного boolean-значения один бит регистра флагов, при условии, что это значение никогда не попадает в оперативную память (отдельно от других). Поэтому любые ограничения на размер более одного бита тоже могут потенциально мешать. И эта свобода представления позволяет авторам виртуальных машин Java использовать любые реализации, которые они считают наиболее эффективными в каждом конкретном контексте. Как видно из примеров выше, любые ограничения будут только мешать.

Ответ 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. Что использовать — решать Вам.

Ответ 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, а кое где и вовсе как бит

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

Отправить комментарий