132

I can't find an answer in the standard documentation. Does the C++ language standard require sizeof(bool) to always be 1 (for 1 byte), or is this size implementation-defined?

einpoklum
  • 102,731
  • 48
  • 279
  • 553
0xbadf00d
  • 16,085
  • 15
  • 62
  • 100

4 Answers4

187

sizeof(bool) is implementation defined, and the standard puts notable emphasis on this fact.

§5.3.3/1, abridged:

sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; the result of sizeof applied to any other fundamental type is implementation-defined. [Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.69)]

Footnote 69):

sizeof(bool) is not required to be 1.

GManNickG
  • 478,574
  • 51
  • 478
  • 539
20

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

"In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and later, the same call yields 1. This can cause memory corruption problems if you have defined structure members of type bool in Visual C++ 4.2 and are mixing object files (OBJ) and/or DLLs built with the 4.2 and 5.0 or later compilers."

Yi Ling
  • 277
  • 3
  • 11
  • 2
    You do realize that this is somewhat related to the question, but clearly not an answer, since 0xbadf00d asked about the standard, not some specific/arbitrarily selected compiler implementation, right? – Christopher Creutzig Dec 12 '13 at 22:27
  • 15
    @ChristopherCreutzig It is a proof by counterexample. – kinokijuf May 24 '14 at 20:50
  • 18
    @kinokijuf It's not a counterexample. There are many things in Visual C++ that are not standard-compliant. – 0xbadf00d May 13 '16 at 15:43
11

It's implementation defined. Only sizeof(char) is 1 by the standard.

peoro
  • 24,831
  • 19
  • 94
  • 148
  • 2
    pls note that the 1 in the standard can mean 4 byte. Than every type is a product of 4. So care that the standard ONLY defines char is the 1, but not defines the measurment. – user3063349 Feb 10 '16 at 16:39
  • 1 means 8 bits or 1 byte in the standard – paulm Jul 01 '16 at 11:41
  • 14
    1 byte. The number of bits per byte is not defined by the standard (it needs to be at least 8 IIRC), but can be found in `CHAR_BIT`, defined in `climits`. – peoro Jul 02 '16 at 02:13
3

See 5.3.3 paragraph 1 :

[Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.69) ]

BЈовић
  • 59,719
  • 40
  • 167
  • 261