Sizeof (bool) è definito nello standard del linguaggio C ++?


115

Non riesco a trovare una risposta nella documentazione standard. Lo standard del linguaggio C ++ richiede sizeof(bool)di essere sempre 1 (per 1 byte) o questa dimensione è definita dall'implementazione?

Risposte:


167

sizeof(bool) l'implementazione è definita e lo standard pone un notevole accento su questo fatto.

§5.3.3 / 1, abbreviato:

sizeof(char), sizeof(signed char)E sizeof(unsigned char)sono 1; il risultato dell'applicazione sizeofa qualsiasi altro tipo fondamentale è definito dall'implementazione. [Nota: in particolare, sizeof(bool)e sizeof(wchar_t)sono definiti dall'implementazione. 69) ]

Nota 69):

sizeof(bool) non è necessario che sia 1.


c'è un flag con cui devo compilare il mio programma, per il quale il mio compilatore utilizzerà solo 1 byte bool?
Eagle

3
@ Eagle: Dipende dal tuo compilatore, non ne sono sicuro. Probabilmente è meglio che tu lo lasci al tuo compilatore.
GManNickG

5
nota che std :: vector <bool> è ottimizzato per un vettore contenente bool a 1 bit dallo standard.
user3063349

15

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

"In Visual C ++ 4.2, i file di intestazione C ++ standard contenevano un typedef che equivaleva a bool con int. In Visual C ++ 5.0 e versioni successive, bool è implementato come un tipo incorporato con una dimensione di 1 byte. Ciò significa che per Visual C ++ 4.2, una chiamata di sizeof (bool) restituisce 4, mentre in Visual C ++ 5.0 e versioni successive, la stessa chiamata restituisce 1. Ciò può causare problemi di danneggiamento della memoria se sono stati definiti membri della struttura di tipo bool in Visual C ++ 4.2 e si combinano oggetti file (OBJ) e / o DLL creati con i compilatori 4.2 e 5.0 o successivi. "


2
Ti rendi conto che questo è in qualche modo correlato alla domanda, ma chiaramente non una risposta, poiché 0xbadf00d chiedeva dello standard, non di un'implementazione del compilatore specifica / arbitrariamente selezionata, giusto?
Christopher Creutzig

13
@ChristopherCreutzig È una prova per controesempio.
kinokijuf

12
@kinokijuf Non è un controesempio. Ci sono molte cose in Visual C ++ che non sono conformi agli standard.
0xbadf00d

11

È definita l'implementazione. Solo sizeof(char)è 1per lo standard.


2
si prega di notare che 1 nello standard può significare 4 byte. Quindi ogni tipo è un prodotto di 4. Quindi attenzione che lo standard SOLO definisca char è 1, ma non definisce la misurazione.
user3063349

1 significa 8 bit o 1 byte nello standard
paulm

11
1 byte. Il numero di bit per byte non è definito dallo standard (deve essere almeno 8 IIRC), ma può essere trovato in CHAR_BIT, definito in climits.
peoro

3

Vedere 5.3.3 paragrafo 1:

[Nota: in particolare, sizeof (bool) e sizeof (wchar_t) sono definiti dall'implementazione.69)]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.