Как заставить размер "bool" под GCC

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

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

5 ответов

Решение

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

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

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

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

(Или, для сумасшедших, измените gcc для обработки bool как 4-байтового типа.)

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

#define bool int

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

Другие вопросы по тегам