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


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.


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 ”.


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.


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)]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.