2010-12-15 64 views
2

我目前正在从另一个平台移植一些代码,新平台上的bools是1个字节大小。这是破坏我们的加载代码,因为值存储为32位值。此外,速度是我们平台上的一个关键问题,我们希望使用32位bools,因为处理器本地运行在32位,并且需要额外的操作来比较非32位bool。我如何强制海湾合作委员会'bool'的大小

有没有办法强制gcc使用32位bools而不是8位bools?

+0

不幸的是,我只知道Apple的GCC上的-mone-byte-bool开关,但它与你想要的相反。 – 2010-12-15 02:49:48

+0

我想修复你的加载代码是不可能的? (它真的不应该假设像int或bool这样的内置类型的大小) – jalf 2010-12-15 08:37:49

+0

原来,加载代码已经正确处理了大小的差异。问题来自另一部分加载代码,假定枚举的大小为4个字节。这是通过简单地在那里有'FORCE_DWORD'值来解决的。 – 2010-12-23 14:28:01

回答

1

您可以创建自己的课程,该课程在内部使用int32_t,但其行为如同bool。这意味着你不得不重新命名你想要使用这种类型的字段,这是更多的工作,但提供了更好的控制和隔离,并且你仍然可以在其他地方使用真实的bool。我个人更喜欢任何#define hackery,它可能会在某处出乎意料。我还会提醒,不要假设32位的int会比单个字节更快......其他因素(如流水线,内存延迟,缓存大小等)可能会使差异变得微不足道,甚至会使32位的处理速度变慢,所以你可能想要在你的系统中用代表性的数据处理进行基准测试。

+0

这实际上是我发布后不久提出的选项。虽然不理想,但比typedef /#define更好,因为我需要编译器可识别的类型之间的差异。 – 2010-12-23 14:26:14

2
#define bool int 
+2

这很愚蠢,它会打破太多的东西。 – wilx 2010-12-15 08:15:07

+5

@wilx,如果加载代码被写入,以致在太多地方假定bool的大小只是修复它,那么代码已经很愚蠢并且被破坏了。 – 2010-12-15 11:38:49

3

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的所有使用情况,那么尺寸不匹配几乎肯定会让您受到影响。

+0

我正在阅读链接问题的答案的方式是,在包含标准头之前执行'#define bool int'是非法的,但可以在之后执行。你不能期望改变你没有编译的代码中的bools的长度,比如外部(和标准)库。 – 2010-12-15 03:19:33

+0

@Paul:那么,如果他们在bool和int上都有专门的模板,你会得到编译错误。 (如'iostream'。)真正的挑战是,如果'bool'在其代码库中如此广泛地传播以至于它们不能只是's/bool/int/g',那么在每个使用'bool'的位置都无法执行'#define'可能是一个真正的问题。 – Bill 2010-12-15 05:46:58

6

添加#define BOOL_TYPE_SIZE 4gcc/config/i386/i386.h并重新编译GCC)

1

您需要将内部数据结构从存储/加载代码分开。只需将bools存储在您的平台的本地bool类型的内部数据结构中,并在读取/写入数据时从存储的一个字节布尔值进行适当的转换。

相关问题