В С++,
- Почему логический 1 байт, а не 1 бит размера?
- Почему нет таких типов, как 4-битные или 2-битные целые числа?
Мне не хватает вышеуказанных вещей при написании эмулятора для CPU
В С++,
Мне не хватает вышеуказанных вещей при написании эмулятора для CPU
Потому что CPU не может адресовать что-либо меньшее, чем байт.
От Wikipedia:
Исторически байт был числом биты, используемые для кодирования одного символа текста в компьютере, и это по этой причине основной адресный элемент на многих компьютерах архитектуры.
Таким образом, байтом является базовый адресный блок, ниже которого компьютерная архитектура не может адресовать. А поскольку нет (возможно) компьютеров, поддерживающих 4-битный байт, у вас нет 4-разрядных bool
и т.д.
Однако, если вы можете спроектировать такую архитектуру, которая может адресовать 4-разрядную базовую адресную единицу, тогда у вас будет bool
размера 4-бит, тогда только на этом компьютере!
Самый простой ответ: потому что процессор обрабатывает память в байтах, а не в битах, а побитовые операции очень медленные.
Однако возможно использовать распределение по битам в С++. Там std::vector специализация для битовых векторов, а также структуры, принимающие записи размера бит.
В прежние времена, когда мне приходилось ходить в школу в бушующей метели, в горах в обе стороны и в обеденное время было какое-то животное, которое мы могли бы выследить в лесу за школой и убить голыми руками, компьютеры были намного меньше доступной памяти, чем сегодня. Первый компьютер, который я когда-либо использовал, имел 6 КБ ОЗУ. Не 6 мегабайт, не 6 гигабайт, 6 килобайт. В этой среде было очень важно собрать как можно больше булевых в int, и поэтому мы будем регулярно использовать операции, чтобы вытащить их и вставить их.
Сегодня, когда люди будут издеваться над вами за то, что у вас всего 1 ГБ ОЗУ, и единственное место, где вы можете найти жесткий диск с объемом менее 200 ГБ, находится в антикварном магазине, просто не стоит того, чтобы упаковывать биты.
У вас могут быть 1-битные bools и 4 и 2-битные int. Но это создало бы странный набор команд для повышения производительности, поскольку это неестественный способ взглянуть на архитектуру. На самом деле имеет смысл "тратить" большую часть байта, а не пытаться восстановить неиспользуемые данные.
Единственное приложение, которое пытается упаковать несколько bools в один байт, по моему опыту, - это Sql Server.
Вы можете использовать битовые поля для получения целых чисел субразмера.
struct X
{
int val:4; // 4 bit int.
};
Хотя он обычно используется для сопоставления структур с точными аппаратными ожидаемыми битовыми шаблонами:
struct SomThing // 1 byte value (on a system where 8 bits is a byte
{
int p1:4; // 4 bit field
int p2:3; // 3 bit field
int p3:1; // 1 bit
};
Поскольку байт - это наименьшая адресуемая единица в языке.
Но вы можете сделать bool взять 1 бит, например, если у вас есть куча из них например. в структуре, например:
struct A
{
bool a:1, b:1, c:1, d:1, e:1;
};
Поскольку, как правило, ЦП выделяет память с 1 байтом в качестве базового блока, хотя некоторые процессоры, такие как MIPS, используют 4-байтовое слово.
Однако vector
имеет специальную форму bool
, при этом vector<bool>
выделяется один бит для каждого bool.
bool
может быть одним байтом - наименьшим адресуемым размером процессора или может быть больше. Нестандартно иметь bool
размер int
для целей производительности. Если для конкретных целей (например, аппаратное моделирование) вам нужен тип с N битами, вы можете найти библиотеку для этого (например, библиотека GBL имеет класс BitSet<N>
). Если вы заинтересованы в размере bool
(у вас, вероятно, есть большой контейнер), вы можете сами упаковать биты или использовать std::vector<bool>
, который сделает это за вас (будьте осторожны с последним, так как он не удовлетворяет требования к контейнерам).
Даже если минимальный размер может быть 1 байт, вы можете иметь 8 бит булевой информации на 1 байт:
http://en.wikipedia.org/wiki/Bit_array
Язык Джулии имеет BitArray, например, и я читал о реализациях С++.
Логическое значение будет иметь один бит, если ваш процессор будет 1 бит процессора.
В общем случае размер бита процессора (например, 8 бит, 16 бит, 32 бит и т.д.) является мерой наименьшего размера данных, который может обрабатываться процессором - таким образом, это ТАКЖЕ размер адресное пространство. (Так как указатели и данные на разных уровнях одинаковы).
Байт - это меньшая единица хранения цифровых данных компьютера. В компьютере ОЗУ имеет миллионы байт, и каждый из них имеет адрес. Если бы у него был адрес для каждого бита, компьютер мог бы управлять на 8 раз меньше ОЗУ, чем он может.
Дополнительная информация: Wikipedia
Подумайте, как реализовать это на уровне эмулятора...
bool a[10] = {false};
bool &rbool = a[3];
bool *pbool = a + 3;
assert(pbool == &rbool);
rbool = true;
assert(*pbool);
*pbool = false;
assert(!rbool);