Hầu hết các trình biên dịch C ++ được lựa chọn để gây ra lỗi biên dịch khi cố gắng lấy sizeof(void)
.
Khi biên dịch C, gcc không phù hợp và được chọn định nghĩa sizeof(void)
là 1. Nó có thể trông lạ, nhưng có cơ sở. Khi bạn thực hiện số học con trỏ thêm hoặc bớt một đơn vị có nghĩa là thêm hoặc bớt đối tượng được trỏ tới kích thước. Do đó, xác định sizeof(void)
là 1 giúp xác địnhvoid*
như một con trỏ tới byte (địa chỉ bộ nhớ không định kiểu). Nếu không, bạn sẽ có những hành vi đáng ngạc nhiên khi sử dụng số học con trỏ như p+1 == p when
p void*
. Số học con trỏ như vậy trên con trỏ void không được phép trong c ++ nhưng hoạt động tốt khi biên dịch C với gcc.
Cách tiêu chuẩn được đề xuất sẽ là sử dụng char*
cho loại mục đích đó (con trỏ đến byte).
Một sự khác biệt tương tự khác giữa C và C ++ khi sử dụng sizeof xảy ra khi bạn xác định một cấu trúc trống như:
struct Empty {
} empty;
Sử dụng gcc làm trình biên dịch C của tôi sizeof(empty)
trả về 0. Sử dụng g ++ cùng một mã sẽ trả về 1.
Tôi không chắc điều gì đã nêu cả tiêu chuẩn C và C ++ về điểm này, nhưng tôi tin rằng việc xác định kích thước của một số cấu trúc / đối tượng trống sẽ giúp quản lý tham chiếu để tránh hai tham chiếu đến các đối tượng liên tiếp khác nhau, đối tượng đầu tiên trống, hãy lấy cùng địa chỉ. Nếu tham chiếu được triển khai bằng cách sử dụng con trỏ ẩn như nó thường được thực hiện, việc đảm bảo địa chỉ khác nhau sẽ giúp so sánh chúng.
Nhưng điều này chỉ đơn thuần là tránh một hành vi đáng ngạc nhiên (so sánh trường hợp góc của các tham chiếu) bằng cách đưa vào một cái khác (các đối tượng trống, thậm chí các POD sử dụng bộ nhớ ít nhất 1 byte).