Apakah sizeof (bool) ditentukan dalam standar bahasa C ++?

115

Saya tidak dapat menemukan jawaban dalam dokumentasi standar. Apakah standar bahasa C ++ harus sizeof(bool)selalu 1 (untuk 1 byte), atau apakah ukuran ini ditentukan oleh implementasi?

0xbadf00d
sumber

Jawaban:

167

sizeof(bool) adalah implementasi yang ditentukan, dan standar menekankan pada fakta ini.

§5.3.3 / 1, diringkas:

sizeof(char), sizeof(signed char)dan sizeof(unsigned char)1; hasil dari sizeofpenerapan pada tipe fundamental lainnya ditentukan oleh implementasi. [Catatan: secara khusus, sizeof(bool)dan sizeof(wchar_t)ditentukan oleh implementasi. 69) ]

Catatan kaki 69):

sizeof(bool) tidak harus 1.

GManNickG
sumber
adakah sebuah flag yang saya perlukan untuk mengkompilasi program saya, bahwa kompiler saya hanya akan menggunakan 1 byte bool?
Elang
3
@Eagle: Terserah kompiler Anda, saya tidak yakin. Mungkin lebih baik Anda menyerahkannya pada kompiler Anda.
GManNickG
5
perhatikan bahwa std :: vector <bool> dioptimalkan ke vektor yang berisi bit 1bit menurut standar.
pengguna3063349
15

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

Pada Visual C ++ 4.2 file header Standard C ++ berisi typedef yang disamakan bool dengan int. Pada Visual C ++ 5.0 dan yang lebih baru, bool diimplementasikan sebagai built-in type dengan ukuran 1 byte. Itu artinya untuk Visual C ++ 4.2, panggilan sizeof (bool) menghasilkan 4, sedangkan dalam Visual C ++ 5.0 dan yang lebih baru, panggilan yang sama menghasilkan 1. Hal ini dapat menyebabkan masalah kerusakan memori jika Anda telah menetapkan anggota struktur tipe bool dalam Visual C ++ 4.2 dan objek pencampuran file (OBJ) dan / atau DLL yang dibuat dengan kompiler 4.2 dan 5.0 atau yang lebih baru. "

Yi Ling
sumber
2
Anda menyadari bahwa ini agak terkait dengan pertanyaan, tetapi jelas bukan jawaban, karena 0xbadf00d bertanya tentang standar, bukan implementasi compiler yang dipilih secara spesifik / sewenang-wenang, bukan?
Christopher Creutzig
13
@ChristopherCreutzig Ini adalah bukti oleh counterexample.
kinokijuf
12
@kinokijuf Ini bukan counterexample. Ada banyak hal dalam Visual C ++ yang tidak memenuhi standar.
0xbadf00d
11

Implementasinya ditentukan. Hanya sizeof(char)adalah 1oleh standar.

peoro
sumber
2
harap dicatat bahwa 1 dalam standar dapat berarti 4 byte. Dari setiap jenis adalah produk 4. Jadi perhatian bahwa standar HANYA mendefinisikan karakter adalah 1, tetapi tidak mendefinisikan ukuran.
pengguna3063349
1 berarti 8 bit atau 1 byte dalam standar
paulm
11
1 byte. Jumlah bit per byte tidak ditentukan oleh standar (minimal harus 8 IIRC), tetapi dapat ditemukan di CHAR_BIT, didefinisikan di climits.
peoro
3

Lihat 5.3.3 paragraf 1:

[Catatan: khususnya, sizeof (bool) dan sizeof (wchar_t) ditentukan oleh implementasi.69)]

BЈовић
sumber