Почему логическое значение хранится в байтах внутри компьютера, когда требуется только один бит

32

Недавно я начал учиться писать код, и в своей книге я столкнулся с этим вопросом. «Почему логическое значение хранится в байтах внутри компьютера, когда ему требуется только один бит?» может кто-то пролить больше света на этот вопрос?

Г 1,0
источник
10
Строго говоря, это не так. Некоторые языки (например, C / C ++) предоставляют способы хранения логических значений в виде отдельных битов, если эти биты объединены в один байт. Другими словами, в C вы можете хранить восемь логических значений в байте. Но мало кто когда-либо использовал это, так как память дешева, а процессоры манипулируют данными в битах 16/32/32/64.
Gort the Robot
Этот ответ на аналогичный вопрос , что вы должны увидеть! Вы получите огромную ссылку там ... Ура!
Сэм
2
Дубликат stackoverflow.com/questions/14220726/one-byte-bool-why
Стоп Harm Моника
Близко связаны: stackoverflow.com/questions/8014161/…
Бен Ли

Ответы:

49

Это связано с тем, что процессор может легко решить. Например, на процессоре x86 есть eax(32 бита), ax(16 бит) и a ah(8 бит), но нет однобитового регистра. Таким образом, чтобы использовать один бит, ЦПУ должен будет выполнить чтение / изменение / запись для изменения значения. Если он хранится в виде байта, для проверки / изменения значения можно использовать одно чтение или запись.

Кроме того, может возникнуть вопрос, лучше ли использовать один бит против полного байта, ведь байт будет тратить 7 бит. Если пробел не является ограничением, нужно идти за байтом, потому что, по крайней мере, x86 и, я думаю, другие, обычно есть инструкции для быстрой установки / очистки bool, который намного быстрее, чем чтение / изменение / запись одного бита , Из личных измерений я видел, что метод чтения / модификации / записи был в 5 раз медленнее, чем метод с одной инструкцией.

barrem23
источник
6
Единственное слово, которое вам не хватает, это "Выравнивание границ".
Manoj R
3
С другой стороны, я наблюдал двукратное ускорение от использования отдельных битов, вероятно, из-за лучшего использования кэша с меньшим набором данных.
Майкл Боргвардт
5

Как объясняет @ barrem23 , данные должны быть адресуемыми , а наименьшей границей в традиционных архитектурах является байт.

Но так как этот вопрос помечен как , возможно, стоит отметить, что std::vector<bool>он специализирован для хранения отдельных элементов в виде битов . Это сэкономит место, пожертвовав некоторыми функциями (например, std::searchможет не работать).

chrisaycock
источник