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


Answers:


167

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。


是否有一个我需要用来编译程序的标志,我的编译器将只使用1个字节bool

3
@Eagle:这取决于您的编译器,我不确定。最好将它留给编译器处理。
GManNickG 2011年

5
请注意,标准将std :: vector <bool>优化为包含1bit bool的向量。
user3063349 '02

15

http://msdn.microsoft.com/zh-CN/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。”


2
您确实意识到这与问题有关,但显然不是答案,因为0xbadf00d询问了标准,而不是某些特定/任意选择的编译器实现,对吗?
Christopher Creutzig 2013年

13
@ChristopherCreutzig这是反例的证明。
kinokijuf 2014年

12
@kinokijuf这不是一个反例。Visual C ++中有许多不符合标准的内容。
0xbadf00d

11

它是实现的定义。仅sizeof(char)1由标准。


2
请注意,标准中的1表示4字节。每种类型都不是4的乘积。因此请注意,标准仅将char定义为1,而不定义测量。
user3063349 '02

1表示标准中的8位或1字节
paulm '16

11
1个字节 每个字节的位数不是由标准定义的(必须至少为8 IIRC),但可以在中CHAR_BIT定义的中找到climits
peoro '16

3

见5.3.3第1段:

[注意:尤其是sizeof(bool)和sizeof(wchar_t)是实现定义的。69)]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.