sizeof (bool) ถูกกำหนดไว้ในมาตรฐานภาษา C ++ หรือไม่


115

ฉันไม่พบคำตอบในเอกสารมาตรฐาน มาตรฐานของภาษา C ++ จำเป็นต้องsizeof(bool)เป็น 1 เสมอ (สำหรับ 1 ไบต์) หรือมีการกำหนดการใช้งานขนาดนี้หรือไม่

คำตอบ:


167

sizeof(bool) มีการกำหนดการนำไปใช้งานและมาตรฐานให้ความสำคัญกับข้อเท็จจริงนี้เป็นอย่างมาก

§5.3.3 / 1 ย่อ:

sizeof(char), sizeof(signed char)และsizeof(unsigned char)เป็น 1; ผลลัพธ์ของsizeofการนำไปใช้กับประเภทพื้นฐานอื่น ๆ คือการกำหนดการนำไปใช้งาน [หมายเหตุ: โดยเฉพาะsizeof(bool)และsizeof(wchar_t)มีการกำหนดการนำไปใช้งาน 69) ]

เชิงอรรถ 69):

sizeof(bool) ไม่จำเป็นต้องเป็น 1


มีแฟล็กที่ฉันต้องคอมไพล์โปรแกรมด้วยหรือไม่คอมไพลเลอร์ของฉันจะใช้เพียง 1 ไบต์สำหรับbool?
Eagle

3
@ อีเกิล: นั่นขึ้นอยู่กับคอมไพเลอร์ของคุณฉันไม่แน่ใจ อาจเป็นการดีที่สุดที่คุณปล่อยไว้ในคอมไพเลอร์ของคุณ
GManNickG

5
โปรดทราบว่า std :: vector <bool> ได้รับการปรับให้เหมาะกับเวกเตอร์ที่มีบูล 1 บิตตามมาตรฐาน
user3063349

15

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

"ใน Visual C ++ 4.2 ไฟล์ส่วนหัว C ++ มาตรฐานมี typedef ที่จัดวางบูลด้วย int ใน Visual C ++ 5.0 และใหม่กว่าบูลจะถูกนำไปใช้เป็นชนิดในตัวที่มีขนาด 1 ไบต์นั่นหมายความว่าสำหรับ Visual C ++ 4.2 การเรียกของ sizeof (bool) ให้ผล 4 ในขณะที่ Visual C ++ 5.0 ขึ้นไปผลตอบแทนการโทรเดียวกัน 1 สิ่งนี้อาจทำให้เกิดปัญหาหน่วยความจำเสียหายหากคุณกำหนดสมาชิกโครงสร้างของประเภทบูลใน Visual C ++ 4.2 และกำลังผสมวัตถุ ไฟล์ (OBJ) และ / หรือ DLL ที่สร้างขึ้นด้วยคอมไพเลอร์ 4.2 และ 5.0 หรือใหม่กว่า "


2
คุณทราบดีว่าสิ่งนี้ค่อนข้างเกี่ยวข้องกับคำถาม แต่ไม่ใช่คำตอบอย่างชัดเจนเนื่องจาก 0xbadf00d ถามเกี่ยวกับมาตรฐานไม่ใช่การใช้งานคอมไพเลอร์ที่เจาะจง / เลือกโดยพลการใช่ไหม
Christopher Creutzig

13
@ChristopherCreutzig มันเป็นหลักฐานจากตัวอย่างตัวอย่าง
kinokijuf

12
@kinokijuf มันไม่ได้เป็นการตอบโต้ มีหลายสิ่งใน Visual C ++ ที่ไม่เป็นไปตามมาตรฐาน
0xbadf00d

11

มีการกำหนดการใช้งาน เพียง แต่sizeof(char)เป็น1โดยมาตรฐาน


2
โปรดทราบว่า 1 ในมาตรฐานอาจหมายถึง 4 ไบต์ กว่าทุกประเภทคือผลคูณของ 4 ดังนั้นโปรดระวังว่ามาตรฐานเท่านั้นที่กำหนดถ่านคือ 1 แต่ไม่ได้กำหนดการวัด
user3063349

1 หมายถึง 8 บิตหรือ 1 ไบต์ในมาตรฐาน
paulm

11
1 ไบต์ จำนวนบิตต่อไบต์ไม่ได้กำหนดโดยมาตรฐาน (ต้องมีอย่างน้อย 8 IIRC) แต่สามารถพบได้ในCHAR_BITกำหนดในclimits.
peoro

3

ดู 5.3.3 ย่อหน้า 1:

[หมายเหตุ: โดยเฉพาะ sizeof (bool) และ sizeof (wchar_t) ได้รับการกำหนดการใช้งาน 69)]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.