我目前正在从另一个平台移植一些代码,新平台上的布尔值是 1 字节大小。这破坏了我们的加载代码,因为值存储为 32 位值。此外,速度是我们平台上的一个关键问题,我们希望使用 32 位布尔值,因为处理器本身以 32 位运行,并且需要额外的操作来比较非 32 位布尔值。
有没有办法强制 gcc 使用 32 位布尔而不是 8 位布尔?
我目前正在从另一个平台移植一些代码,新平台上的布尔值是 1 字节大小。这破坏了我们的加载代码,因为值存储为 32 位值。此外,速度是我们平台上的一个关键问题,我们希望使用 32 位布尔值,因为处理器本身以 32 位运行,并且需要额外的操作来比较非 32 位布尔值。
有没有办法强制 gcc 使用 32 位布尔而不是 8 位布尔?
添加并#define BOOL_TYPE_SIZE 4
重新gcc/config/i386/i386.h
编译 gcc ;)
bool 的大小是实现定义的(5.3.3),gcc 似乎没有提供在运行时配置它的选项。
希望您的实现定义的代码是隔离的。如果是这样,请将您bool
的 s 更改为int
s,或更改您的加载代码以处理 sizeof() == 1 而不是 4。
(或者,对于疯狂的人,改变 gcc 以将 bool 视为 4 字节类型。)
编辑:Paul Tomblin 的使用建议#define
可能不合法[see here],但至少在 gcc 4.1.2 下它确实有效。[链接]但是,如果你不按大小不匹配的每一次使用bool
几乎肯定会咬你。
#define bool int
您需要将内部数据结构与存储/加载代码分开。只需将布尔值以平台的本机类型存储在内部数据结构中bool
,并在读取/写入数据时从/到存储的一字节布尔值进行适当的转换。
您可以创建自己的类,该类在int32_t
内部使用但行为类似于bool
. 这确实意味着您必须重命名您特别想使用该类型的字段,这需要更多的工作,但可以提供更好的控制和隔离,并且您仍然可以bool
在其他地方使用 real s。我个人更喜欢任何#define hackery,它可能会在意想不到的地方咬人。我还警告不要假设 32 位int
将比单个字节有用地快......流水线、内存延迟、缓存大小等其他因素可能会使差异变得微不足道甚至使 32 位int
更慢,所以你可能希望通过具有代表性的数据处理在您的系统中对其进行基准测试。