为什么sizeof(bool)没有被标准本身定义为一个?

时间:2011-02-21 15:01:57

标签: c++ boolean standards sizeof

C ++标准本身将charsigned charunsigned char的大小定义为1个字节。我想知道它为什么没有定义sizeof(bool)呢?

C ++ 03标准$ 5.3.3 / 1说,

  

sizeof(char),sizeof(signed char)和   sizeof(unsigned char)是1;该   sizeof应用于任何其他的结果   基本类型(3.9.1)是   实现定义。 [注意: in   特别是,sizeof(bool)和   sizeof(wchar_t)是   实现定义 0.69)

我理解sizeof(bool) cannot be less than one byte的理由。但有没有理由说它为什么应该大于1个字节呢?我并不是说实现将其定义为大于1,但标准使其由实现定义,就像它可能大于1一样。

如果没有理由sizeof(bool)大于1,那么我不明白为什么标准没有将其定义为1 byte,因为它定义了sizeof(char) ,这都是变种。

4 个答案:

答案 0 :(得分:27)

另一个可能的大小是int的大小,是平台的“有效”整数类型。

在体系结构中,无论实现选择1还是sizeof(int)都有所不同,可能需要在大小之间进行权衡(但如果您愿意为每bool浪费7位,那么为什么不应该这样做?你是否乐意浪费31?当大小重要时使用位域)与性能(但是当存储和加载bool值是真正的性能问题时?当速度很重要时明确使用int)。因此实现灵活性获胜 - 如果由于某种原因1在性能或代码大小方面会很糟糕,它可以避免它。

答案 1 :(得分:23)

正如@MSalters指出的那样,某些平台可以更有效地处理更大的数据项。

许多“RISC”CPU(例如,MIPS,PowerPC,Alpha的早期版本)在使用小于一个字的数据时遇到了相当困难的时间,所以他们也这样做。 IIRC,至少有一些关于Alpha的编译器,bool实际上占用了64位。

对于PowerPC Mac,gcc默认使用4个字节作为bool,但如果你愿意,可以通过切换将其更改为一个字节。

即使对于x86,使用32位数据项也有一些优势。 x86的gcc已经(或者至少曾经 - 我最近没有查看)在BOOL_TYPE_SIZE的一个配置文件中定义(从内存开始,所以我可以有一点点这个名字)您可以设置为1或4,然后重新编译编译器以获得该大小的布尔值。

编辑:至于背后的原因,我想说这是对C和C ++基本理念的简单反映:为实现留出尽可能多的空间来优化/定制其行为是合理的。只有当/如果有明显的,有形的好处并且不太可能是任何重大责任时才需要特定的行为,特别是如果更改会使得在某个特定平台上支持C ++变得更加困难(当然,如果平台足够的话)晦涩难懂,可能会被忽略。)

答案 2 :(得分:19)

许多平台无法有效加载小于32位的值。它们必须加载32位,并使用移位和掩码操作来提取8位。您不希望单个bool使用此功能,但字符串也可以。

答案 3 :(得分:1)

该操作导致' sizeof'是MADU(最小可添加单位),而不是字节。所以家庭处理器C54 *。 C55 * Texas Instuments,表达式1 MADU = 2个字节。

对于此平台sizeof(bool)= sizeof(char)= 1 MADUs = 2个字节。 这并不违反C ++标准,但澄清了这种情况。