Подтвердить что ты не робот

Почему для типа булевых данных требуется 8 бит?

Тип данных Boolean вычисляет только true или false, поэтому он всегда будет принимать только один бит памяти. Итак, зачем нужна дополнительная 7-разрядная память, разве это не пустая трата памяти?

4b9b3361

Ответ 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 байт.