В C ++ мне интересно, почему тип bool имеет длину 8 бит (в моей системе), где только одного бита достаточно для хранения логического значения?
Раньше я полагал, что это было из соображений производительности, но затем на 32-битной или 64-битной машине, где регистры имеют ширину 32 или 64 бит, в чем преимущество производительности?
Или это всего лишь одна из этих «исторических» причин?
sizeof(bool)
будет 4. Могу поклясться, что у msvc были 32-битные логические значения, но я просто попробовал, но этого не произошло.vector<bool>
не в том, что он пытается быть умным и упаковывать bools в биты, а в том, что он пытается это сделать и замаскировать себя под контейнер STL . Обычный битовый набор был бы хорош, если бы он также не претендовал на роль контейнера STL.bool
тип данных C ++ сBOOL
типом Windows, для которого задан типlong
. Итакsizeof(bool) != sizeof(BOOL)
, что, я уверен, вызывает большую путаницу (и, вероятно, изрядное количество ошибок). Тем более что в Windows естьboolean
иBOOLEAN
typedef, которые являются псевдонимами дляunsigned char
. Также обратите внимание, что, хотя обычноbool
это 1 байт, в стандарте C ++ есть примечание, в котором конкретно указывается, что онsizeof(bool)
может быть больше.Ответы:
Потому что каждый тип данных C ++ должен быть адресуемым.
Как бы вы создали указатель на один бит? Ты не можешь Но вы можете создать указатель на байт. Таким образом, логическое значение в C ++ обычно имеет размер в байтах. (Он также может быть больше. Это зависит от реализации. Главное, чтобы он был адресуемым, поэтому тип данных C ++ не может быть меньше байта)
источник
Память адресуется побайтно. Вы не можете адресовать ни один бит без сдвига или маскирования байта, прочитанного из памяти. Я думаю, это очень серьезная причина.
источник
boolean
Типа , который обычно следует за наименьшую единицу адресуемой памяти целевой машины (т.е. , как правило, 8bits байт).Доступ к памяти всегда осуществляется «порциями» (несколько слов, это для эффективности на аппаратном уровне , транзакции шины): логический бит не может быть адресован «в одиночку» в большинстве систем ЦП. Конечно, после того, как данные содержатся в регистре , часто существуют специальные инструкции для независимого управления битами.
По этой причине довольно часто используются методы «битовой упаковки» для повышения эффективности использования «логических» базовых типов данных. Такой метод, как
enum
(в C) с кодированием степени 2, является хорошим примером. Такой же прием можно найти в большинстве языков.Обновлено : благодаря отличному обсуждению, мое внимание было обращено на то, что
sizeof(char)==1
по определению в C ++. Следовательно, адресация «логического» типа данных в значительной степени привязана к наименьшей единице адресуемой памяти (подтверждает мою точку зрения).источник
bool
тип следует за наименьшей единицей выделяемой памяти, потому что C ++ требует, чтобы была возможность создавать указатели на него . Без этого требования abool
можно было бы представить как отдельный бит даже на современных машинах с байтовой адресацией.sizeof(char)==1 definition
это лучший контраргумент моей аргументации. Спасибо!Ответы о том, что 8-битный наименьший объем адресуемой памяти, верны. Однако некоторые языки могут в некотором смысле использовать 1-бит для логических значений. Кажется, я помню, как Паскаль реализовывал наборы как битовые строки. То есть для следующего набора:
У вас может быть это в памяти:
Конечно, вы можете сделать что-то подобное на C / C ++, если хотите. (Если вы отслеживаете кучу логических значений, это может иметь смысл, но это действительно зависит от ситуации.)
источник
vector
. На самом деле это не контейнер типа STL, потому что на его поведение накладываются ограничения. Что еще хуже, это вызывает проблемы с кем-то, у кого естьbool
s и кто хочет сделатьvector
из них. Это удивительное поведение, а это не то, что вы хотите от языка.Я знаю, что это старый, но я подумал, что брошу свои 2 цента.
Если вы ограничите логическое значение или тип данных одним битом, ваше приложение подвергнется риску нарушения памяти. Как вы обрабатываете статистику ошибок в памяти, длина которой составляет всего один бит?
Я пошел на собеседование, и одно из заявлений, которые руководитель программы сказал мне, было: «Когда мы отправляем сигнал для запуска ракеты, мы просто отправляем простой бит на выключение по беспроводной сети. Отправка одного бита выполняется очень быстро, и мы нужно, чтобы сигнал был как можно быстрее ".
Ну, это был тест, чтобы увидеть, понимаю ли я концепции и биты, байты и обработку ошибок. Как легко плохому парню послать однобитное сообщение. Или что произойдет, если во время передачи бит перевернется в другую сторону.
источник
bool
используется 8 бит на машине OP и 32 на моей, так как эти 7 или 31 бит определенно не используются для какой-либо «статистики ошибок». В этом нет никакого смыслаНекоторые встроенные компиляторы имеют тип int1, который используется для битовой упаковки логических флагов (например, серия компиляторов C CCS для микропроцессоров Microchip). Для установки, очистки и тестирования этих переменных используются инструкции на уровне битов с одной инструкцией, но компилятор не разрешает никаких других операций (например, получение адреса переменной) по причинам, указанным в других ответах.
источник