C ++: почему длина bool 8 бит? - PullRequest
125 голосов
/ 14 января 2010

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

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

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

Ответы [ 6 ]

211 голосов
/ 14 января 2010

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

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

38 голосов
/ 14 января 2010

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

18 голосов
/ 14 января 2010

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

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

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

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

6 голосов
/ 14 января 2010

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

{1, 2, 5, 7}

Возможно, у вас есть это в памяти:

01100101

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

1 голос
/ 28 сентября 2015

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

1 голос
/ 14 февраля 2013

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

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

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

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

...