sizeof(bool) 是不是在 C++ 语言标准中定义?

Posted

技术标签:

【中文标题】sizeof(bool) 是不是在 C++ 语言标准中定义?【英文标题】:Is sizeof(bool) defined in the C++ language standard?sizeof(bool) 是否在 C++ 语言标准中定义? 【发布时间】:2011-06-21 08:03:32 【问题描述】:

我在标准文档中找不到答案。 C++ 语言标准是否要求 sizeof(bool) 始终为 1(对于 1 个字节),还是这个大小是实现定义的?

【问题讨论】:

【参考方案1】:

sizeof(bool) 是实现定义的,标准特别强调了这一事实。

§5.3.3/1,删节:

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

脚注 69):

sizeof(bool) 不需要为 1。

【讨论】:

是否有一个标志需要我编译我的程序,我的编译器将只为bool 使用 1 个字节? @Eagle:这取决于你的编译器,我不确定。最好将其留给您的编译器。 请注意,std::vector 按标准优化为包含 1 位布尔值的向量。 @user3063349 有参考吗? @user3063349 真的是标准的吗? This 提到实现依赖【参考方案2】:

http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx

“在 Visual C++4.2 中,标准 C++ 头文件包含一个 typedef,将 bool 等同于 int。在 Visual C++ 5.0 及更高版本中,bool 被实现为大小为 1 字节的内置类型。这意味着对于 Visual C++ 4.2,sizeof(bool) 的调用产生 4,而在 Visual C++ 5.0 及更高版本中,相同的调用产生 1。如果您在 Visual C++ 4.2 中定义了 bool 类型的结构成员和正在混合使用 4.2 和 5.0 或更高版本的编译器构建的目标文件 (OBJ) 和/或 DLL。"

【讨论】:

您确实意识到这与问题有些相关,但显然不是答案,因为 0xbadf00d 询问的是标准,而不是一些特定/任意选择的编译器实现,对吧? @ChristopherCreutzig 是反例证明。 @kinokijuf 这不是反例。 Visual C++ 中有很多东西不符合标准。【参考方案3】:

它是实现定义的。只有sizeof(char) 是标准的1

【讨论】:

请注意标准中的 1 可以表示 4 个字节。比每种类型都是 4 的乘积。因此请注意标准仅定义 char 是 1,但不定义测量值。 1 表示标准中的 8 位或 1 字节 1 个字节。标准中没有定义每个字节的位数(至少需要 8 个 IIRC),但可以在CHAR_BIT 中找到,在climits 中定义。【参考方案4】:

参见 5.3.3 第 1 段:

[注意:特别是 sizeof(bool) 和 sizeof(wchar_t) 是 实现定义.69) ]

【讨论】:

以上是关于sizeof(bool) 是不是在 C++ 语言标准中定义?的主要内容,如果未能解决你的问题,请参考以下文章

C++入门C++和C语言比较:新增的和有变化的关键字

C++入门C++和C语言比较:新增的和有变化的关键字

C语言与C++常见面试题

C++面试八股文快问快答の基础篇

iOS学习之C语言Day02

不评估应用了 sizeof 的表达式是不是使得在 C++ 中取消引用 sizeof 内的空指针或无效指针是合法的?