Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Tại sao sizeof struct không bằng tổng sizeof từng thành viên trong C/C++?


Kích thước kiểu struct lấy bởi sizeof() không luôn bằng tổng kích thước từng thành viên. Đôi khi trình biên dịch thêm padding (đệm) tránh vấn đề căn chỉnh (alignment). Do đó kích thước thay đổi. Padding thêm khi thành viên cấu trúc theo sau thành viên kích thước lớn hơn hoặc ở cuối cấu trúc. Trình biên dịch khác có ràng buộc căn chỉnh khác. Theo chuẩn C, căn chỉnh cấu trúc tổng thể phụ thuộc triển khai.

Trường hợp 1

Trong trường hợp này double z dài 8 byte, lớn hơn x (4 byte). Do đó thêm 4 byte padding. Kiểu short y có 2 byte nên thêm 6 byte padding.

Tại sao sizeof struct không bằng tổng sizeof từng thành viên trong C/C++?

Ví dụ mã

#include <stdio.h>
struct myStruct {
    int x;      // Integer 4 byte, padding 4 byte
    double z;   // double 8 byte, không padding
    short int y; // short 2 byte, padding 6 byte
};
main() {
    printf("Kích thước struct: %d", sizeof(struct myStruct));
}

Kết quả 2

Kích thước struct: 24

Trường hợp 2

Đặt double trước, chiếm 8 byte. int x (4 byte) thêm vào, còn 4 byte trống. Khi thêm short y, nó lấp vào 4 byte đó, tổng 16 byte.

Tại sao sizeof struct không bằng tổng sizeof từng thành viên trong C/C++?

Ví dụ mã

#include <stdio.h>
struct myStruct {
    double z;   // double 8 byte, không padding
    int x;      // int 4 byte, padding 4 byte
    short int y; // short 2 byte, padding 6 byte
};
main() {
    printf("Kích thước struct: %d", sizeof(struct myStruct));
}

Kết quả 2

Kích thước struct: 16

Trường hợp 3

Trường hợp 3 cũng 16 byte nhưng sắp xếp khác. double trước, sau short y. Khi chèn int x, nó lấp vào 6 byte còn lại. Có padding sau short nhưng không padding sau int.

Tại sao sizeof struct không bằng tổng sizeof từng thành viên trong C/C++?

Ví dụ mã

#include <stdio.h>
struct myStruct {
    double z;   // double 8 byte, không padding
    short int y; // short 2 byte, padding 6 byte
    int x;      // int 4 byte, padding 4 byte
};
main() {
    printf("Kích thước struct: %d", sizeof(struct myStruct));
}

Kết quả 2

Kích thước struct: 16