Naw*_*waz 35 c++ standards boolean sizeof
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)的结果是实现定义的.[注意:特别是sizeof(bool)和sizeof(wchar_t)是实现定义的 .69)
我理解sizeof(bool)不能小于一个字节的基本原理.但有没有理由说它为什么应该大于1个字节呢?我并不是说实现将它定义为大于1,但是标准使它被实现定义为好像它可能大于1.
如果没有理由sizeof(bool)大于1,那么我不明白为什么标准没有1 byte像它定义的那样定义它sizeof(char),而且它是所有变体.
Ste*_*sop 27
另一个可能的大小是int,作为平台的"有效"整数类型.
在体系结构中,无论实现选择1还是sizeof(int)可以在大小之间进行权衡(但如果您乐意每次浪费7位bool,那么为什么不应该乐于浪费31?在大小时使用位域)事情)与性能(但是当存储和加载bool值是一个真正的性能问题时?int在速度很重要时明确使用).因此实现灵活性获胜 - 如果由于某种原因1在性能或代码大小方面会很糟糕,它可以避免它.
Jer*_*fin 24
正如@MSalters指出的那样,某些平台可以更有效地处理大型数据项.
许多"RISC"CPU(例如,MIPS,PowerPC,Alpha的早期版本)在使用小于一个字的数据时遇到了相当困难的时间,因此它们也是如此.IIRC,至少有一些关于Alpha的编译器,bool实际上占用了64位.
PowerPC Mac的gcc默认使用4个字节作为bool,但如果你愿意,可以通过切换将其更改为一个字节.
即使对于x86,使用32位数据项也有一些优势.x86的gcc已经(或者至少曾经 - 我最近没有看过)在其配置文件中的一个定义BOOL_TYPE_SIZE(从内存中去,所以我的名字可能有点错误)你可以设置为1或4,然后重新编译编译器以获得该大小的bool.
编辑:至于背后的原因,我想说这是对C和C++基本理念的简单反映:为实现留出尽可能多的空间来优化/定制其行为是合理的.只有当/如果有明显的,有形的好处并且不太可能是任何重大责任时才需要特定的行为,特别是如果更改会使得在某个特定平台上支持C++变得更加困难(当然,如果平台足够的话)模糊不清,可能会被忽略).
MSa*_*ers 19
许多平台无法有效加载小于32位的值.它们必须加载32位,并使用移位和掩码操作来提取8位.你不会想要单个bools,但它对于字符串是可以的.