Размер упакованной структуры Bools - PullRequest
5 голосов
/ 27 октября 2010

Если 1 bool равен 1 байту [8 битов], то упакованная структура из 4 bools будет 32 битами или 4?Директива pack устраняет требование выравнивания, но сделает ли это наборы bools более эффективными [в отношении памяти]?

Ответы [ 4 ]

6 голосов
/ 27 октября 2010

Да. Даже упакованная логическая структура будет использовать по крайней мере 8 бит на логическое значение. Если вы не используете битовые поля .

1 голос
/ 27 октября 2010

Размер bool может варьироваться от ОС к ОС и от языка к языку. Я видел, что это был байт, слово и целое число (что, в свою очередь, может быть чем угодно). Но если sizeof (bool) равен 1, то упакованная структура bools будет 4 (байтами) (т.е. 32 бита)

Вместо того, чтобы возиться с упаковкой и выравниванием, почему бы не использовать:

std::vector<bool>

От: http://www.cplusplus.com/reference/stl/vector/

Это оптимизировано (или должно быть) внутренне, чтобы быть битовым полем. Попробуйте, вы увидите, что используемая память соответствует одному биту на значение.

В противном случае вы всегда можете свернуть свою собственную библиотеку или использовать ограниченные макросы FD_SET.

1 голос
/ 27 октября 2010

4 bool с.

Каждому bool нужен уникальный адрес (так как вы можете взять адрес bool). Если вы используете битовое поле, вы можете уменьшить размер до 1 bool, но вы не сможете получить адрес отдельного битового поля.

0 голосов
/ 27 октября 2010

Это определяется реализацией.Стандарт не определяет размер логического значения.

РЕДАКТИРОВАТЬ

Это от стандарта:

5.3.3 Sizeof

Оператор sizeof возвращает количество байтов в объектном представлении своего операнда.Операндом является либо выражение, которое не вычисляется, либо идентификатор типа в скобках.Оператор sizeof не должен применяться к выражению, которое имеет функцию или неполный тип, или к типу перечисления до того, как все его перечислители были объявлены, или к названию таких типов в скобках, или к lvalue, который обозначает битовое поле.sizeof (символ), sizeof (символ со знаком) и sizeof (символ без знака) равны 1;результат sizeof, примененный к любому другому фундаментальному типу (3.9.1), определяется реализацией.[Примечание: в частности sizeof (bool) и sizeof (wchar_t) определяются реализацией .69)] [Примечание: см. 1.7 для определения байта и 3.9 для определения представления объекта.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...