如何在 GCC 下强制设置“布尔”的大小
Posted
技术标签:
【中文标题】如何在 GCC 下强制设置“布尔”的大小【英文标题】:How do I force the size of a 'bool' under GCC 【发布时间】:2010-12-15 02:40:28 【问题描述】:我目前正在从另一个平台移植一些代码,新平台上的布尔值是 1 字节大小。这破坏了我们的加载代码,因为值存储为 32 位值。此外,速度是我们平台上的一个关键问题,我们希望使用 32 位布尔值,因为处理器本身以 32 位运行,并且需要额外的操作来比较非 32 位布尔值。
有没有办法强制 gcc 使用 32 位布尔值而不是 8 位布尔值?
【问题讨论】:
遗憾的是,我只知道 Apple 的 GCC 上的 -mone-byte-bool 开关,但它与您想要的相反。 我想修复你的加载代码是不可能的? (它真的不应该假设像int
或bool
这样的内置类型的大小)
原来加载代码已经正确处理了大小的差异。问题来自加载代码的另一部分,假设枚举的大小为 4 个字节。只需在其中添加一个“FORCE_DWORD”值即可解决此问题。
【参考方案1】:
将#define BOOL_TYPE_SIZE 4
添加到gcc/config/i386/i386.h
并重新编译gcc ;)
【讨论】:
【参考方案2】:bool 的大小由实现定义(5.3.3),gcc 似乎没有提供在运行时配置它的选项。
希望您的实现定义的代码是隔离的。如果是这样,请将您的 bool
s 更改为 int
s,或更改您的加载代码以处理 sizeof() == 1 而不是 4。
(或者,对于疯狂的人,更改 gcc 以将 bool 视为 4 字节类型。)
编辑:Paul Tomblin 建议使用#define
可能不合法[see here],但至少在 gcc 4.1.2 下它确实有效。 [Link] 但是,如果你没有达到bool
的所有用法,那么大小不匹配几乎肯定会咬你。
【讨论】:
我阅读链接问题的答案的方式是,在包含标准标题之前执行#define bool int
是非法的,但之后可以这样做。你不能指望在你不编译的代码中改变布尔值的长度,比如外部(和标准)库。
@Paul:那,如果他们专门针对 bool 和 int 模板,你会得到编译错误。 (例如iostream
。)真正的挑战是,如果bool
在他们的代码库中传播得如此广泛以至于他们不能只使用s/bool/int/g
,那么在每个使用bool
的位置都不能使用#define
可能是一个真正的问题。【参考方案3】:
#define bool int
【讨论】:
@wilx,如果加载代码的编写使得 bool 的大小在太多地方被假定为只是修复它,那么代码已经很愚蠢和损坏了。【参考方案4】:您可以创建自己的类,该类在内部使用int32_t
,但行为类似于bool
。这确实意味着您必须重命名您特别想使用该类型的字段,这需要更多的工作,但可以提供更好的控制和隔离,并且您仍然可以在其他地方使用真正的bool
s。我个人更喜欢任何#define hackery,它可能会在意想不到的地方咬人。我还警告不要假设 32 位 int
将比单个字节更快......其他因素,如流水线、内存延迟、缓存大小等可能会使差异变得微不足道,甚至使 32 位 @987654325 @s 较慢,因此您可能希望在系统中使用具有代表性的数据处理对其进行基准测试。
【讨论】:
这实际上是我发布后不久想出的选项。不理想,但比 typedef/#define 好,因为我需要编译器可以识别类型之间的差异。【参考方案5】:您需要将内部数据结构与存储/加载代码分开。只需将布尔值存储在平台原生 bool
类型的内部数据结构中,并在读取/写入数据时从/到存储的一字节布尔值进行适当的转换。
【讨论】:
以上是关于如何在 GCC 下强制设置“布尔”的大小的主要内容,如果未能解决你的问题,请参考以下文章
如何强制调整 indexWidgets 的大小以适合 Qt5 QTableView 的单元格