为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

问题描述 投票:0回答:4
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)
,而且都是变体。

c++ boolean standards sizeof language-design
4个回答
31
投票
它的另一个可能的大小是

int

,是平台的“高效”整数类型。

在实现选择 1 或

sizeof(int)

 之间有任何区别的架构上,可能需要在大小之间进行权衡(但如果您愿意每个 
bool
 浪费 7 位,那么您为什么不乐意浪费 31?当大小很重要时使用位域)与性能(但是什么时候存储和加载 bool 值会成为真正的性能问题?当速度很重要时明确使用 
int
)。因此,实现灵活性获胜 - 如果由于某种原因 
1
 在性能或代码大小方面会很糟糕,它可以避免它。


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

许多“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++ 变得更加困难(当然,如果该平台足够强大)晦涩难懂,可能会被忽略)。


20
投票
许多平台无法有效加载小于 32 位的值。他们必须加载 32 位,并使用移位和掩码操作来提取 8 位。对于单个

bool

,您不希望这样做,但对于字符串来说这是可以的。 


1
投票
运算结果“sizeof”是MADU(最小可寻址单元),而不是字节。所以家庭处理器 C54*。 C55 * 德州仪器,表达式 1 MADU = 2 字节。

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

© www.soinside.com 2019 - 2024. All rights reserved.