Czy sizeof (bool) jest zdefiniowane w standardzie języka C ++?

115

Nie mogę znaleźć odpowiedzi w standardowej dokumentacji. Czy standard języka C ++ wymaga, sizeof(bool)aby zawsze wynosić 1 (dla 1 bajtu), czy ten rozmiar jest zdefiniowany w ramach implementacji?

0xbadf00d
źródło

Odpowiedzi:

167

sizeof(bool) jest zdefiniowana implementacja, a norma kładzie szczególny nacisk na ten fakt.

§5.3.3 / 1, w skrócie:

sizeof(char), sizeof(signed char)I sizeof(unsigned char)to 1; wynik sizeofzastosowania do dowolnego innego typu podstawowego jest zdefiniowany w ramach implementacji. [Uwaga: w szczególności sizeof(bool)i sizeof(wchar_t)są zdefiniowane w ramach implementacji. 69) ]

Przypis 69):

sizeof(bool) nie musi być 1.

GManNickG
źródło
czy jest flaga, z którą muszę skompilować mój program, że mój kompilator będzie używał tylko 1 bajtu bool?
Orzeł
3
@Eagle: To zależy od twojego kompilatora, nie jestem pewien. Prawdopodobnie najlepiej zostawić to swojemu kompilatorowi.
GManNickG
5
Zauważ, że std :: vector <bool> jest zoptymalizowany do wektora zawierającego 1-bitowe boole według standardu.
user3063349
15

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

„W programie Visual C ++ 4.2 standardowe pliki nagłówkowe C ++ zawierały definicję typu, która zrównała bool z int. W Visual C ++ 5.0 i nowszych, bool jest zaimplementowany jako typ wbudowany o rozmiarze 1 bajtu. Oznacza to, że dla Visual C ++ 4.2, wywołanie sizeof (bool) daje 4, podczas gdy w Visual C ++ 5.0 i nowszych to samo wywołanie daje 1. Może to powodować problemy z uszkodzeniem pamięci, jeśli masz zdefiniowane składowe struktury typu bool w Visual C ++ 4.2 i mieszasz obiekt pliki (OBJ) i / lub biblioteki DLL utworzone za pomocą kompilatorów w wersji 4.2 i 5.0 lub nowszej ”.

Yi Ling
źródło
2
Zdajesz sobie sprawę, że jest to trochę związane z pytaniem, ale najwyraźniej nie jest to odpowiedź, ponieważ 0xbadf00d zapytał o standard, a nie o jakąś konkretną / arbitralnie wybraną implementację kompilatora, prawda?
Christopher Creutzig
13
@ChristopherCreutzig Jest to dowód przez kontrprzykład.
kinokijuf
12
@kinokijuf To nie jest kontrprzykład. W języku Visual C ++ jest wiele rzeczy, które nie są zgodne ze standardami.
0xbadf00d
11

Jest zdefiniowana implementacja. Tylko sizeof(char)jest 1w normie.

peoro
źródło
2
Proszę zauważyć, że 1 w standardzie może oznaczać 4 bajty. Niż każdy typ jest iloczynem 4. Uważaj więc, aby standard TYLKO definiował char to 1, ale nie definiuje pomiaru.
user3063349
1 oznacza 8 bitów lub 1 bajt w standardzie
paulm
11
1 bajt. Liczba bitów na bajt nie jest zdefiniowana w standardzie (musi wynosić co najmniej 8 IIRC), ale można ją znaleźć w CHAR_BIT, zdefiniowana w climits.
peoro,
3

Patrz 5.3.3 akapit 1:

[Uwaga: w szczególności sizeof (bool) i sizeof (wchar_t) są zdefiniowane przez implementację.69)]

BЈовић
źródło