Почему логический 1 байт, а не 1 бит размера? - PullRequest
112 голосов
/ 07 января 2011

В С ++,

  • Почему логический 1 байт, а не 1 бит размера?
  • Почему нет таких типов, как 4-битные или 2-битные целые числа?

Я упускаю все вышеперечисленное при написании эмулятора для процессора

Ответы [ 13 ]

177 голосов
/ 07 января 2011

Поскольку процессор не может адресовать ничего меньше байта.

27 голосов
/ 07 января 2011

Из Википедия :

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

Таким образом, байт базовая адресуемая единица , ниже которой архитектура компьютера не может адресоваться.И поскольку (вероятно) не существует компьютеров, которые поддерживают 4-битный байт, у вас нет 4-битных bool и т. Д.

Однако, если вы можете создать такойархитектура, которая может обращаться к 4-битному как к базовой адресуемой единице, тогда у вас будет bool размера 4-битного, тогда, только на этом компьютере!

12 голосов
/ 07 января 2011

Самый простой ответ: это потому, что процессор обращается к памяти в байтах, а не в битах, а побитовые операции очень медленные.

Однако в C ++ можно использовать распределение по размерам. Для битовых векторов есть специализация std :: vector, а также структуры, принимающие битовые размеры.

8 голосов
/ 07 января 2011

В старые времена, когда мне приходилось ходить в школу в бушующей метели, в гору в обоих направлениях, и обед был тем животным, которого мы могли выследить в лесу за школой и убить голыми руками, у компьютеров было гораздо меньше Память доступна, чем сегодня. Первый компьютер, который я когда-либо использовал, имел 6K RAM. Не 6 мегабайт, не 6 гигабайт, 6 килобайт. В этой среде имело смысл упаковывать как можно больше логических значений в int, поэтому мы будем регулярно использовать операции для их извлечения и вставки.

Сегодня, когда люди будут издеваться над тем, что у вас есть только 1 ГБ оперативной памяти, и единственное место, где вы можете найти жесткий диск с объемом менее 200 ГБ, находится в антикварной лавке, просто не стоит тратить время на упаковку. 1003 *

6 голосов
/ 07 января 2011

Вы можете иметь 1-битные bools и 4 и 2-битные целые.Но это привело бы к странному набору инструкций без увеличения производительности, потому что это неестественный взгляд на архитектуру.На самом деле имеет смысл «тратить» лучшую часть байта, а не пытаться вернуть эти неиспользуемые данные.

По моему опыту, единственное приложение, которое мешает упаковать несколько бул в один байт, это Sql Server,

5 голосов
/ 07 января 2011

Вы можете использовать битовые поля для получения целых чисел меньшего размера.

struct X
{
    int   val:4;   // 4 bit int.
};

Хотя обычно оно используется для отображения структур в точные аппаратные ожидаемые битовые комбинации:

4 голосов
/ 07 января 2011

Поскольку байт является наименьшей адресуемой единицей в языке.

Но вы можете сделать так, чтобы bool занимал 1 бит, например, если у вас их несколько, например.в структуре, как это:

struct A
{
  bool a:1, b:1, c:1, d:1, e:1;
};
1 голос
/ 24 января 2013

Даже когда минимально возможный размер составляет 1 байт, вы можете иметь 8 бит логической информации на 1 байт:

http://en.wikipedia.org/wiki/Bit_array

Например, в языке Julia есть BitArray, и я прочитало реализации C ++.

1 голос
/ 07 января 2011

bool может быть один байт - наименьший адресуемый размер ЦП или может быть больше.Нередко bool имеет размер int для повышения производительности.Если для конкретных целей (например, аппаратное моделирование) вам нужен тип с N битами, вы можете найти библиотеку для этого (например, библиотека GBL имеет класс BitSet<N>).Если вас интересует размер bool (у вас, вероятно, большой контейнер), то вы можете упаковать биты самостоятельно или использовать std::vector<bool>, который сделает это за вас (будьте осторожны с последним, поскольку он не удовлетворяетконтейнерные требования).

1 голос
/ 07 января 2011

Поскольку обычно ЦП выделяет память с 1 байтом в качестве базовой единицы, хотя некоторые ЦП, такие как MIPS, используют 4-байтовое слово.

Однако vector имеет дело с bool особым образом, с vector<bool> выделяется один бит для каждого bool.

...