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)
,而且都是变体。
int
,是平台的“高效”整数类型。在实现选择 1 或
sizeof(int)
之间有任何区别的架构上,可能需要在大小之间进行权衡(但如果您愿意每个
bool
浪费 7 位,那么您为什么不乐意浪费 31?当大小很重要时使用位域)与性能(但是什么时候存储和加载 bool 值会成为真正的性能问题?当速度很重要时明确使用
int
)。因此,实现灵活性获胜 - 如果由于某种原因
1
在性能或代码大小方面会很糟糕,它可以避免它。
许多“RISC”CPU(例如,MIPS、PowerPC、Alpha 的早期版本)在处理小于一个字的数据时遇到了相当大的困难,因此它们也这样做。 IIRC,至少在 Alpha 上的一些编译器中,bool 实际上占用了 64 位。
PowerPC Mac 的 gcc 默认使用 4 个字节作为布尔值,但如果您愿意,可以通过开关将其更改为 1 个字节。
即使对于 x86,使用 32 位数据项也有一些优势。 x86 的 gcc 在其配置文件之一中有(或者至少曾经有——我最近根本没有看过)
BOOL_TYPE_SIZE
的定义(凭记忆,所以我的名字可能有点错误)您可以将其设置为 1 或 4,然后重新编译编译器以获得该大小的 bool。至于背后的原因,我想说这是 C 和 C++ 基本哲学的简单反映:为实现留出尽可能多的空间来优化/定制其合理的行为。仅当/如果有明显的、切实的好处,并且不太可能产生任何重大责任时,才需要特定的行为,特别是如果更改会使在某些特定平台上支持 C++ 变得更加困难(当然,如果该平台足够强大)晦涩难懂,可能会被忽略)。
bool
,您不希望这样做,但对于字符串来说这是可以的。
对于此平台,sizeof (bool) = sizeof (char) = 1 MADU = 2 字节。 这并不违反C++标准,而是澄清了情况。