Computer >> Máy Tính >  >> Lập trình >> lập trình C

Tại sao sizeof cho một cấu trúc không bằng tổng sizeof của mỗi thành viên trong C / C ++?

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.

Tại sao sizeof cho một cấu trúc không bằng tổng sizeof của mỗi thành viên trong C / C ++?

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.

Tại sao sizeof cho một cấu trúc không bằng tổng sizeof của mỗi thành viên trong C / C ++?

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.

Tại sao sizeof cho một cấu trúc không bằng tổng sizeof của mỗi thành viên trong C / C ++?

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