我目前正在从另一个平台移植一些代码,新平台上的bools是1个字节大小。这是破坏我们的加载代码,因为值存储为32位值。此外,速度是我们平台上的一个关键问题,我们希望使用32位bools,因为处理器本地运行在32位,并且需要额外的操作来比较非32位bool。我如何强制海湾合作委员会'bool'的大小
有没有办法强制gcc使用32位bools而不是8位bools?
我目前正在从另一个平台移植一些代码,新平台上的bools是1个字节大小。这是破坏我们的加载代码,因为值存储为32位值。此外,速度是我们平台上的一个关键问题,我们希望使用32位bools,因为处理器本地运行在32位,并且需要额外的操作来比较非32位bool。我如何强制海湾合作委员会'bool'的大小
有没有办法强制gcc使用32位bools而不是8位bools?
您可以创建自己的课程,该课程在内部使用int32_t
,但其行为如同bool
。这意味着你不得不重新命名你想要使用这种类型的字段,这是更多的工作,但提供了更好的控制和隔离,并且你仍然可以在其他地方使用真实的bool
。我个人更喜欢任何#define hackery,它可能会在某处出乎意料。我还会提醒,不要假设32位的int
会比单个字节更快......其他因素(如流水线,内存延迟,缓存大小等)可能会使差异变得微不足道,甚至会使32位的处理速度变慢,所以你可能想要在你的系统中用代表性的数据处理进行基准测试。
这实际上是我发布后不久提出的选项。虽然不理想,但比typedef /#define更好,因为我需要编译器可识别的类型之间的差异。 – 2010-12-23 14:26:14
#define bool int
这很愚蠢,它会打破太多的东西。 – wilx 2010-12-15 08:15:07
@wilx,如果加载代码被写入,以致在太多地方假定bool的大小只是修复它,那么代码已经很愚蠢并且被破坏了。 – 2010-12-15 11:38:49
bool的大小是实现定义的(5.3.3),并且gcc似乎没有提供在运行时配置它的选项。
希望您的实现定义的代码是孤立的。如果是这样,请将您的bool
s更改为int
s,或更改您的加载代码以处理sizeof()== 1而不是4.
(或者,对于疯狂的情况,请将gool视为bool为4字节)
编辑:Paul Tomblin的建议使用#define
可能不合法[see here],但它至少在gcc 4.1.2下工作。 [Link]但是,如果您未达到bool
的所有使用情况,那么尺寸不匹配几乎肯定会让您受到影响。
我正在阅读链接问题的答案的方式是,在包含标准头之前执行'#define bool int'是非法的,但可以在之后执行。你不能期望改变你没有编译的代码中的bools的长度,比如外部(和标准)库。 – 2010-12-15 03:19:33
@Paul:那么,如果他们在bool和int上都有专门的模板,你会得到编译错误。 (如'iostream'。)真正的挑战是,如果'bool'在其代码库中如此广泛地传播以至于它们不能只是's/bool/int/g',那么在每个使用'bool'的位置都无法执行'#define'可能是一个真正的问题。 – Bill 2010-12-15 05:46:58
添加#define BOOL_TYPE_SIZE 4
到gcc/config/i386/i386.h
并重新编译GCC)
您需要将内部数据结构从存储/加载代码分开。只需将bools存储在您的平台的本地bool
类型的内部数据结构中,并在读取/写入数据时从存储的一个字节布尔值进行适当的转换。
不幸的是,我只知道Apple的GCC上的-mone-byte-bool开关,但它与你想要的相反。 – 2010-12-15 02:49:48
我想修复你的加载代码是不可能的? (它真的不应该假设像int或bool这样的内置类型的大小) – jalf 2010-12-15 08:37:49
原来,加载代码已经正确处理了大小的差异。问题来自另一部分加载代码,假定枚举的大小为4个字节。这是通过简单地在那里有'FORCE_DWORD'值来解决的。 – 2010-12-23 14:28:01