C ++标准本身将char
,signed char
和unsigned 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)
,这都是变种。
答案 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 ++标准,但澄清了这种情况。