Как заставить размер "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
с int
s, или измените свой код загрузки, чтобы иметь дело с sizeof() == 1 вместо 4.
(Или, для сумасшедших, измените gcc для обработки bool как 4-байтового типа.)
Редактировать: предложение Пола Томблина об использовании #define
может не быть законным [см. здесь], но это работает, по крайней мере, в gcc 4.1.2. [Ссылка] Однако, если вы не нажмете каждое использование bool
несоответствие размера почти наверняка укусит вас.
Вы должны отделить свои внутренние структуры данных от кода хранения / загрузки. Просто сохраните bools во внутренних структурах данных на нативной платформе bool
введите и выполните соответствующее преобразование из / в однобайтовые bools хранилища при чтении / записи данных.