Тип данных Boolean вычисляет только true
или false
, поэтому он всегда будет принимать только один бит памяти. Итак, зачем нужна дополнительная 7-разрядная память, разве это не пустая трата памяти?
Почему для типа булевых данных требуется 8 бит?
Ответ 1
Я думаю, что может потребоваться больше 8 бит. Это зависит от JMV. "В Oracle JVM примитиву boolean
требуется 8 бит, причина ограничена поддержкой и отсутствием оптимизации.
Читайте также: Каков размер логической переменной в Java?
После Учебники Java - Примитивные типы данных
boolean. Логический тип данных имеет только два возможных значения: true и false. Используйте этот тип данных для простых флагов, которые отслеживают истинные/ложные условия. Этот тип данных представляет собой один бит информации, , но его "размер" не является тем, что точно определено.
После Спецификация виртуальной машины Java®
Хотя виртуальная машина Java определяет логический тип, она поддерживает только очень ограниченная поддержка для него. Инструкции Java Virtual Machine не указаны исключительно посвященный операциям с булевыми значениями. Вместо этого выражения в Java язык программирования, который работает с булевыми значениями, скомпилирован для использования значений типа данных виртуальной машины Java.
В реализации Oracle Virtual Machine в Oracle..., логические массивы в Java язык программирования закодирован как массивы байтов виртуальной машины Java, , используя 8 бит в boolean element.
Например, Boolean тип выглядит в памяти следующим образом
header: 8 bytes
value: 1 byte
padding: 7 bytes
------------------
sum: 16 bytes
В качестве альтернативы boolean[]
вы можете использовать, например, java.util.BitSet.
Почему трудно хранить логические значения как 1 бит? Прочтите Влад из Москвы. Вы не можете адресовать один бит памяти.
Ответ 2
Это зависит от адресности памяти. Наименьшая адресуемая единица - это байт. Вы можете взять адрес байта и выполнить арифметику адреса с ним. Кроме того, есть встроенные машинные команды, которые работают с байтами. Однако невозможно взять адрес бита и выполнить арифметику адреса. В любом случае сначала вам необходимо вычислить адрес байта, который содержит целевой бит, и применить дополнительные машинные команды, которые зависят от положения бит в байте, который должен установить или reset этот бит.
Ответ 3
См. Реализация виртуальной машины Java в Oracle:
Хотя виртуальная машина Java определяет логический тип, она только обеспечивает очень ограниченную поддержку. Нет Java Virtual Машинные инструкции, предназначенные исключительно для операций с булевыми значениями. Вместо этого выражения на языке программирования Java, которые работают boolean values скомпилированы для использования значений виртуальной машины Java int.
Виртуальная машина Java кодирует элементы логического массива, используя от 1 до представляют true, а 0 - false. Где Java-программирование языковые логические значения сопоставляются компиляторами с значениями Java Тип виртуальной машины int, компиляторы должны использовать одну и ту же кодировку.
Ответ 4
Вы можете увидеть обсуждение фактического размера, используемого здесь:
Каков размер логической переменной в Java?
Но в основном это сводится к компромиссу между эффективностью и производительностью памяти - особенно если учесть, что каждая другая переменная в классе должна все равно начинать выравнивание по словам.
Вы можете выиграть, упаковывая их меньше, когда у вас есть несколько меньших объектов для упаковки, а затем вам по-прежнему необходимо оставить дополнение, чтобы выровнять следующий элемент.
Ответ 5
Разве это не пустая трата памяти?
Да, это пустая трата 7 бит, но, поскольку каждый из нас знает, что байт является наименьшей единицей хранения, JVM говорит, что он имеет 1 байт.