Trình biên dịch thường chèn trailing đệm trên các cấu trúc để đáp ứng sự liên kết hạn chế khi chúng được sử dụng trong các mảng:Trailing đệm trong cấu trúc nội bộ
// Size 4, alignment 2
struct A {
uint16_t x;
uint8_t y;
// Padding 1 byte
};
// Size 6, alignment 2
struct B {
struct A xy;
uint8_t z;
// Padding 1 byte
};
Bây giờ xem xét sự kết hợp của những sử dụng cấu trúc nội bộ:
struct AB {
struct {
uint16_t x;
uint8_t y;
} xy;
uint8_t z;
};
Sau đây có thể vừa với 4 byte, trong khi không phá vỡ các hạn chế căn chỉnh. Ngoài ra, cấu trúc bên trong xy
không có loại nào có thể được sử dụng ở nơi khác, vì vậy, không cần sử dụng đệm lót cho nó.
Nhược điểm là thành viên xy
sẽ không tương thích với struct A
, nhưng có là không có lý do tại sao nó phải như họ đang ở trong định nghĩa loại khác nhau.
Trình biên dịch có được phép thực hiện tối ưu hóa kích thước này không?
Hoặc, để đặt theo cách khác, tiêu chuẩn yêu cầu 2 cấu trúc có thành viên bình đẳng sẽ luôn dẫn đến bố cục bằng nhau không?
Tôi nghĩ rằng trình biên dịch sẽ được phép thực hiện điều này, vì tiêu chuẩn không yêu cầu trình biên dịch để cấu trúc pad. – qbt937