2015-04-02 15 views
5

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?

+0

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

Trả lời

1

Câu trả lời có thể được đưa ra bởi khái niệm về loại tương thích. Nếu t1t2 là các loại tương thích, có thể sử dụng con trỏ đến t1 để truy cập vào bộ nhớ được đặt bằng loại t2.

Trong tiêu chuẩn C11:

6.2.7 loại tương thích và loại composit

  1. ... Hơn nữa, hai cấu trúc, công đoàn, hoặc các loại được liệt kê khai báo trong đơn vị dịch riêng biệt là tương thích nếu thẻ và thành viên của họ đáp ứng các yêu cầu sau: Nếu một thẻ được khai báo bằng thẻ, số khác sẽ được khai báo với cùng một thẻ. Nếu cả hai được hoàn thành ở bất kỳ đâu trong đơn vị dịch tương ứng, thì các yêu cầu bổ sung sau sẽ được áp dụng: sẽ có sự tương ứng một-một giữa các thành viên sao cho mỗi cặp thành viên tương ứng được khai báo với các kiểu tương thích; nếu một thành viên của cặp được khai báo với một bộ định danh căn chỉnh thì phần tử kia được khai báo với một bộ định tuyến căn chỉnh tương đương; và nếu một thành viên của cặp được khai báo với một tên, người kia được khai báo có cùng tên. …

Hai cấu trúc không có cùng thẻ không phải là loại tương thích và tôi không thấy bất kỳ thứ gì buộc chúng có cùng bố cục.

+1

Thật vậy, đó là những gì tôi đã suy nghĩ về quá. Tốt để thấy rằng một người nào đó đã đi đến kết luận tương tự. – user694733

Các vấn đề liên quan