С++: почему bool имеет длину 8 бит?

В С++ мне интересно, почему тип bool имеет длину 8 бит (в моей системе), где достаточно одного бита для хранения логического значения?

Раньше я полагал, что это было по соображениям производительности, но затем на 32-битной или 64-битной машине, где регистры имеют ширину 32 или 64 бит, что такое преимущество производительности?

Или это только одна из этих "исторических" причин?

Ответ 1

Потому что каждый тип данных С++ должен быть адресуемым.

Как бы вы создали указатель на один бит? Вы не можете. Но вы можете создать указатель на байт. Таким образом, логическое значение в С++ обычно имеет размер байта. (Это может быть и больше. Это до реализации. Главное, что он должен быть адресуемым, поэтому ни один тип данных С++ не может быть меньше байта)

Ответ 2

Память байта адресуема. Вы не можете адресовать один бит без сдвига или маскировки байта, считанного из памяти. Я бы предположил, что это очень большая причина.

Ответ 3

A boolean Обычно тип следует за наименьшей единицей адресной памяти целевой машины (т.е. обычно 8-битным байтом).

Доступ к памяти всегда находится в "кусках" (несколько слов, это эффективность на аппаратном уровне, транзакции шины): логический бит не может быть адресован "один" в большинстве систем ЦП, Конечно, как только данные содержатся в регистре , часто используются специальные инструкции для самостоятельного управления битами.

По этой причине достаточно распространять методы "бит-упаковки" , чтобы повысить эффективность использования "булевых" базовых типов данных. Хорошим примером является такой метод, как enum (в C) с мощностью 2 кодирования. Подобный трюк встречается на большинстве языков.

Обновлено. Благодаря отличному обсуждению мне было сообщено, что sizeof(char)==1 по определению в С++. Следовательно, адресация "логического" типа данных довольно привязана к наименьшей единице адресной памяти (усиливает мою точку).

Ответ 4

Ответы на 8 бит, являющиеся наименьшим количеством памяти, которые адресуются, являются правильными. Тем не менее, некоторые языки могут использовать 1-бит для булевых элементов. Кажется, я помню, что Pascal реализует наборы как битовые строки. То есть для следующего набора:

{1, 2, 5, 7}

У вас может быть это в памяти:

01100101

Вы можете, конечно, сделать что-то подобное в C/С++, если хотите. (Если вы отслеживаете кучу логических значений, это может иметь смысл, но это действительно зависит от ситуации.)

Ответ 5

Некоторые встроенные компиляторы имеют тип int1, который используется для бит-булевых флагов (например, CCS-серии компиляторов C для Microchip MPU). При настройке, очистке и тестировании этих переменных используются инструкции с одним инструкцией на уровне бит, но компилятор не разрешает другие операции (например, принимать адрес переменной) по причинам, указанным в других ответах.

Ответ 6

Я знаю, что это уже давно, но я думал, что брошу свои 2 цента.

Если вы ограничиваете свой логический тип или тип данных одним битом, то ваше приложение подвержено риску для суммирования памяти. Как вы обрабатываете статистику ошибок в памяти, длина которой составляет всего один бит?

Я отправился на собеседование на работу, и одно из заявлений, которые, по словам руководства программы, сказали мне: "Когда мы отправляем сигнал для запуска промаха, мы просто отправляем простой бит на бит через беспроводную сеть. быстро, и нам нужно, чтобы сигнал был как можно быстрее".

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