在C++语言标准中是否定义了sizeof(bool)?
在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类型的大小可能会有差异,但我们可以通过注意兼容性问题和使用条件编译指令来解决这个问题。
在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位布尔值的向量。
有关此优化的参考资料吗?
真的是标准吗?这个提到了实现依赖性。