Kích thước của một phần tử kiểu struct được lấy bởi sizeof () không phải lúc nào cũng bằng kích thước của từng thành viên riêng lẻ. Đôi khi các trình biên dịch thêm một số đệm để tránh các vấn đề về căn chỉnh. Vì vậy kích thước có thể thay đổi. Phần đệm được thêm vào khi một thành viên cấu trúc được theo sau bởi một cấu tử có kích thước lớn hơn hoặc ở cuối cấu trúc. Các trình biên dịch khác nhau có các loại ràng buộc căn chỉnh khác nhau. Trong tiêu chuẩn C, cấu trúc liên kết tổng thể phụ thuộc vào việc triển khai.
Trường hợp 1
Trong trường hợp này, z kép dài 8 byte, lớn hơn x (4 byte). Vì vậy, một khoảng đệm 4 byte khác được thêm vào. Ngoài ra, dữ liệu kiểu ngắn y có không gian 2 byte trong bộ nhớ nên 6 byte bổ sung được thêm vào làm phần đệm.
Mã mẫu
#include <stdio.h> struct myStruct { int x; //Integer takes 4 bytes, and padding 4 bytes double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Đầu ra 2
Size of struct: 24
Trường hợp 2
Trong trường hợp này, lúc đầu dấu đôi được chèn và nó chiếm 8 byte không gian. Bây giờ số nguyên x (4 byte) được thêm vào. Vì vậy, có một không gian 4 byte khác. Khi chữ y ngắn được thêm vào, nó có thể được đặt vào không gian 4 byte bổ sung đó và chiếm tổng cộng 16 byte không gian.
Mã mẫu
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding int x; //Integer takes 4 bytes, and padding 4 bytes short int y; //Size of short is 2-byte, padding 6-bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Đầu ra 2
Size of struct: 16
Trường hợp 3
Trong trường hợp thứ ba, nó cũng chiếm 16 byte không gian bộ nhớ, nhưng cách sắp xếp khác nhau. Vì thành viên đầu tiên là đôi nên lúc đầu nó được đặt, sau đó dữ liệu kiểu ngắn được thêm vào. Bây giờ khi số nguyên đang cố gắng chèn, nó có thể được đặt vào vùng 6 byte còn lại. Vì vậy, một phần đệm xuất hiện sau short nhưng không cần đệm sau dữ liệu số nguyên.
Mã mẫu
#include <stdio.h> struct myStruct { double z; //Size of double is 8-byte, no padding short int y; //Size of short is 2-byte, padding 6-bytes int x; //Integer takes 4 bytes, and padding 4 bytes }; main() { printf("Size of struct: %d", sizeof(struct myStruct)); }
Đầu ra 2
Size of struct: 16