Sizeof (bool) có được định nghĩa trong tiêu chuẩn ngôn ngữ C ++ không?


115

Tôi không thể tìm thấy câu trả lời trong tài liệu tiêu chuẩn. Tiêu chuẩn ngôn ngữ C ++ có yêu cầu sizeof(bool)phải luôn là 1 (cho 1 byte) hay việc triển khai kích thước này được xác định?

Câu trả lời:


167

sizeof(bool) việc thực hiện được xác định, và tiêu chuẩn nhấn mạnh đáng chú ý đến thực tế này.

§5.3.3 / 1, được rút gọn:

sizeof(char), sizeof(signed char)sizeof(unsigned char)là 1; kết quả của việc sizeofáp dụng cho bất kỳ kiểu cơ bản nào khác là do việc triển khai xác định. [Lưu ý: cụ thể sizeof(bool)sizeof(wchar_t)được xác định bởi việc triển khai. 69) ]

Chú thích chân trang 69):

sizeof(bool) không bắt buộc phải là 1.


có cờ mà tôi cần để biên dịch chương trình của mình, mà trình biên dịch của tôi sẽ chỉ sử dụng 1 byte cho boolkhông?
Eagle

3
@Eagle: Điều đó tùy thuộc vào trình biên dịch của bạn, tôi không chắc. Tốt nhất bạn nên để nó cho trình biên dịch của mình.
GManNickG

5
lưu ý rằng std :: vector <bool> được tối ưu hóa thành vector chứa bools 1bit theo tiêu chuẩn.
user3063349 10/02/16

15

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

"Trong Visual C ++ 4.2, các tệp tiêu đề C ++ tiêu chuẩn chứa một typedef tương đương với bool với int. Trong Visual C ++ 5.0 trở lên, bool được triển khai dưới dạng kiểu tích hợp với kích thước 1 byte. Điều đó có nghĩa là đối với Visual C ++ 4.2, lệnh gọi sizeof (bool) cho kết quả 4, trong khi trong Visual C ++ 5.0 trở lên, lệnh gọi tương tự cho kết quả 1. Điều này có thể gây ra vấn đề hỏng bộ nhớ nếu bạn đã xác định cấu trúc thành viên kiểu bool trong Visual C ++ 4.2 và đang trộn đối tượng tệp (OBJ) và / hoặc DLL được xây dựng bằng trình biên dịch 4.2 và 5.0 trở lên. "


2
Bạn có nhận ra rằng điều này có phần liên quan đến câu hỏi, nhưng rõ ràng không phải là câu trả lời, vì 0xbadf00d hỏi về tiêu chuẩn, không phải một số triển khai trình biên dịch cụ thể / được lựa chọn tùy ý, phải không?
Christopher Creutzig

13
@ChristopherCreutzig Đó là một bằng chứng bằng ví dụ phản chứng.
kinokijuf

12
@kinokijuf Đây không phải là một ví dụ ngược lại. Có nhiều thứ trong Visual C ++ không tuân thủ tiêu chuẩn.
0xbadf00d

11

Việc triển khai nó được xác định. Chỉ sizeof(char)1theo tiêu chuẩn.


2
Xin lưu ý rằng 1 trong tiêu chuẩn có thể có nghĩa là 4 byte. Hơn mọi loại là sản phẩm của 4. Vì vậy, hãy chú ý rằng tiêu chuẩn CHỈ xác định char là 1, nhưng không xác định phép đo.
user3063349 10/02/16

1 có nghĩa là 8 bit hoặc 1 byte trong tiêu chuẩn
paulm

11
1 byte. Số lượng bit trên mỗi byte không được xác định theo tiêu chuẩn (nó cần ít nhất 8 IIRC), nhưng có thể được tìm thấy trong CHAR_BIT, được xác định trong climits.
peoro

3

Xem 5.3.3 đoạn 1:

[Lưu ý: cụ thể là sizeof (bool) và sizeof (wchar_t) được xác định bởi việc triển khai.69)]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.