С++: почему 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 цента.
Если вы ограничиваете свой логический тип или тип данных одним битом, то ваше приложение подвержено риску для суммирования памяти. Как вы обрабатываете статистику ошибок в памяти, длина которой составляет всего один бит?
Я отправился на собеседование на работу, и одно из заявлений, которые, по словам руководства программы, сказали мне: "Когда мы отправляем сигнал для запуска промаха, мы просто отправляем простой бит на бит через беспроводную сеть. быстро, и нам нужно, чтобы сигнал был как можно быстрее".
Ну, это был тест, чтобы понять, поняли ли я понятия и биты, байты и обработку ошибок. Как легко было бы для плохого парня отправить один бит. Или что произойдет, если во время передачи бит перевернется в другую сторону.