Non riesco a trovare una risposta nella documentazione standard. sizeof(bool)
è sempre 1 byte oppure è stata definita l'implementazione?È definita la dimensione di (bool)?
risposta
È stata definita l'implementazione e lo standard attribuisce notevole importanza a tale chiarezza.
§5.3.3/1, abbreviata:
sizeof(char)
,sizeof(signed char)
esizeof(unsigned char)
sono 1; il risultato disizeof
applicato a qualsiasi altro tipo fondamentale è definito dall'implementazione. [Nota: in particolare,sizeof(bool)
esizeof(wchar_t)
sono definiti dall'implementazione. 69)]
nota 69):
sizeof(bool)
non è richiesto di essere 1.
È stata definita l'implementazione. Solo lo sizeof(char)
corrisponde allo standard 1
.
nota che 1 nello standard può significare 4 byte. Di ogni tipo è un prodotto di 4. Quindi attenzione che lo standard SOLO definisce char è 1, ma non definisce la misurazione – user3063349
1 significa 8 bit o 1 byte nello standard – paulm
1 byte. Il numero di bit per byte non è definito dallo standard (deve essere a almeno 8 IIRC), ma può essere trovato in 'CHAR_BIT', definito in' climits'. – peoro
Vedere 5.3.3 comma 1:
[Nota : in particolare, sizeof (bool) e sizeof (wchar_t) sono implementazione-defined.69)]
http://msdn.microsoft.com/en-us/library/tf4dy80a.aspx
"In Visual C++ 4.2, lo Standard C++ file header conteneva un typedef che equiparato bool con int. In Visual C++ 5.0 e versioni successive, bool viene implementato come un tipo predefinito 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 resa 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 stanno mescolando i file oggetto (OBJ) e/o DLL compilati con i compilatori 4.2 e 5.0 o successivi. "
Ti rendi conto che questo è in qualche modo correlato alla domanda, ma chiaramente non è una risposta, dal momento che 0xbadf00d ha chiesto dello standard, non di un'implementazione del compilatore specifica/arbitrariamente selezionata, giusto? –
@ChristopherCreutzig È una prova del controesempio. – kinokijuf
@kinokijuf Non è un controesempio. Esistono molte cose in Visual C++ che non sono conformi allo standard. – 0xbadf00d
+1 per enfatizzare l'enfasi! –
+1 per la nota a piè di pagina che sottolinea l'enfasi ;-) – Nawaz
c'è una bandiera con cui ho bisogno di compilare il mio programma, che il mio compilatore userà solo 1 byte per 'bool'? – Eagle