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

27 浏览
0 Comments

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

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

0
0 Comments

在C++语言标准中,sizeof(bool)的定义是实现相关的。只有sizeof(char)在标准中定义为1

需要注意的是,标准中的1可以表示4字节。因此,每种类型都是4的倍数。所以要注意的是,标准只定义了char的大小为1,但并没有定义其他类型的大小。

在标准中,1表示8位或1字节。

每个字节中的位数并没有在标准中定义(它至少应该是8位),但可以在climits中找到CHAR_BIT的定义。

0
0 Comments

在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)和/或DLLs,这可能会导致内存损坏问题。

这个问题的出现是因为在不同版本的Visual C++中,bool类型的大小不统一,而在C++语言标准中并没有明确定义bool类型的大小。因此,使用bool类型的结构成员时需要注意在不同编译器版本之间的兼容性问题。

解决这个问题的方法是在代码中避免依赖bool类型的大小,尽量使用bool的值而不是大小进行判断。另外,可以使用条件编译指令来根据编译器版本选择不同的实现方式。例如,可以使用#ifdef指令判断编译器版本,并根据不同版本的bool类型大小进行相应的处理。

总之,虽然在不同版本的编译器中bool类型的大小可能会有差异,但我们可以通过注意兼容性问题和使用条件编译指令来解决这个问题。

0
0 Comments

在C++语言标准中,sizeof(bool)是实现定义的,标准对此事实有着明显的强调。

根据C++语言标准§5.3.3/1的规定:

sizeof(char)sizeof(signed char)sizeof(unsigned char)都是1;对于其他基本类型应用sizeof运算符的结果是由实现定义的。[注意:特别地,sizeof(bool)sizeof(wchar_t)是由实现定义的。69)]

脚注69)进一步说明:

sizeof(bool)不要求为1。

是否有一个编译标志,可以让编译器只使用1个字节来表示bool

:这取决于你的编译器,我不确定。最好让编译器自行决定。

需要注意的是,标准中将std::vector<bool>优化为包含1位布尔值的向量。

有关此优化的参考资料吗?

真的是标准吗?这个提到了实现依赖性。

0