Как заставить размер "bool" под GCC - PullRequest
2 голосов
/ 15 декабря 2010

В настоящее время я портирую некоторый код с другой платформы, а bool на новой платформе имеет размер 1 байт. Это нарушает наш код загрузки, так как значения хранятся в виде 32-битных значений. Кроме того, скорость является критической проблемой на нашей платформе, и мы хотели бы использовать 32-разрядные логические переменные, поскольку процессор работает на 32-битной версии и требует дополнительных операций для сравнения не 32-битных логических операций.

Есть ли способ заставить gcc использовать 32-битные bools вместо 8-bit bools?

Ответы [ 5 ]

6 голосов
/ 15 декабря 2010

Добавьте #define BOOL_TYPE_SIZE 4 к gcc/config/i386/i386.h и перекомпилируйте gcc;)

3 голосов
/ 15 декабря 2010

Размер bool определяется реализацией (5.3.3), и gcc, по-видимому, не предоставляет опцию для настройки этого во время выполнения.

Надеемся, ваш код, определенный реализацией, изолирован.Если это так, измените bool s на int s или измените код загрузки, чтобы он работал с sizeof () == 1 вместо 4.

(или для сумасшедшего alter gcc для обработкиbool как 4-байтовый тип.)

Редактировать: предложение Пола Томблина об использовании #define может быть недопустимым [см. здесь] , но оно работает в gcc 4.1.2,по крайней мере. [Ссылка] Однако, если вы не нажмете на каждое использование bool, несоответствие размеров почти наверняка вас укусит.

2 голосов
/ 15 декабря 2010
#define bool int
1 голос
/ 15 декабря 2010

Вам необходимо отделить ваши внутренние структуры данных от кода хранения / загрузки. Просто сохраните bool во внутренних структурах данных в собственном типе bool вашей платформы и выполните соответствующее преобразование из / в однобайтовые bools хранилища при чтении / записи данных.

1 голос
/ 15 декабря 2010

Вы можете создать свой собственный класс, который использует int32_t внутри, но ведет себя как bool. Это означает, что вам придется переименовывать поля, которые вы специально хотите использовать, в этот тип, что более трудоемко, но обеспечивает лучший контроль и изоляцию, и вы все равно можете использовать реальные bool в другом месте. Я лично предпочел бы это любой хакерской атаке #define, которая может оказаться неожиданной. Я бы также предостерег от предположения, что 32-битный int будет полезнее быстрее, чем один байт ... другие факторы, такие как конвейерная обработка, задержки памяти, размеры кэша и т. Д., Могут сделать разницу незначительной или даже сделать 32-битный int медленнее, так что вы можете сравнить его в своей системе с представительной обработкой данных.

...