sizeof()로 얻은 구조 유형 요소의 크기가 각 개별 멤버의 크기와 항상 같지는 않습니다. 때때로 컴파일러는 정렬 문제를 피하기 위해 약간의 패딩을 추가합니다. 따라서 치수가 변경될 수 있습니다. 구조체 멤버 뒤에 더 큰 크기의 멤버가 있거나 구조체의 끝에 있을 때 패딩이 추가됩니다. 컴파일러마다 정렬 제약 조건이 다릅니다. C 표준에서 전체 정렬 구조는 구현에 따라 다릅니다.
이 경우 double z의 길이는 8바이트로 x(4바이트)보다 큽니다. 따라서 또 다른 4바이트의 패딩이 추가됩니다. 추가적으로, short 타입 데이터 y는 메모리 공간이 2바이트이므로 패딩으로 6바이트가 추가됩니다.
#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)); }
Size of struct: 24
이 경우 먼저 double이 삽입되는데 이는 8바이트의 공간을 차지합니다. 이제 정수 x(4바이트)가 추가됩니다. 따라서 아직 4바이트의 공간이 더 남아 있습니다. 짧은 y를 추가한 후 추가로 4바이트의 공간을 추가하면 총 16바이트의 공간을 차지하게 됩니다.
#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)); }
Size of struct: 16
세 번째 케이스도 16바이트의 메모리 공간을 차지하지만 배열이 다릅니다. 첫 번째 멤버가 double이므로 먼저 배치한 후 short 유형의 데이터를 추가합니다. 이제 정수를 삽입하려고 하면 나머지 6바이트 영역에 삽입할 수 있습니다. 따라서 short 데이터 뒤에는 패딩이 있지만 정수 데이터 뒤에는 패딩이 없습니다.
#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)); }
Size of struct: 16
위 내용은 C/C++에서 구조의 크기가 각 멤버의 크기의 합과 같지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!