Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

구조체의 sizeof가 C/C++에서 각 멤버의 sizeof 합계와 같지 않은 이유는 무엇입니까?

<시간/>

sizeof()에 의해 취해진 구조체 유형 요소의 크기는 각 개별 멤버의 크기와 항상 같지는 않습니다. 때때로 컴파일러는 정렬 문제를 피하기 위해 패딩을 추가합니다. 따라서 크기가 변경될 수 있습니다. 패딩은 구조체 멤버 다음에 더 큰 크기의 멤버가 오거나 구조체의 끝에 추가될 때 추가됩니다. 컴파일러마다 다른 유형의 정렬 제약 조건이 있습니다. C 표준에서 전체 정렬 구조는 구현에 따라 다릅니다.

사례 1

이 경우 double z는 8바이트로 x(4바이트)보다 큽니다. 그래서 또 다른 4바이트 패딩이 추가됩니다. 또한 짧은 유형 데이터 y는 메모리에 2바이트 공간이 있으므로 추가 6바이트가 패딩으로 추가됩니다.

구조체의 sizeof가 C/C++에서 각 멤버의 sizeof 합계와 같지 않은 이유는 무엇입니까?

예시 코드

#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));
}

출력 2

Size of struct: 24

사례 2

이 경우 처음에 double이 삽입되고 8바이트의 공간을 차지합니다. 이제 정수 x(4바이트)가 추가됩니다. 그래서 또 다른 4바이트 공간이 있습니다. 짧은 y가 추가되면 추가 4바이트 공간에 배치될 수 있으며 총 16바이트 공간을 차지합니다.

구조체의 sizeof가 C/C++에서 각 멤버의 sizeof 합계와 같지 않은 이유는 무엇입니까?

예시 코드

#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));
}

출력 2

Size of struct: 16

사례 3

세 번째 경우에도 16바이트의 메모리 공간이 필요하지만 배열이 다릅니다. 첫 번째 멤버는 double이므로 처음에 배치된 다음 short 형식 데이터가 추가됩니다. 이제 정수가 삽입을 시도할 때 나머지 6바이트 영역에 배치할 수 있습니다. 따라서 short 뒤에 하나의 패딩이 있지만 정수 데이터 뒤에는 패딩이 필요하지 않습니다.

구조체의 sizeof가 C/C++에서 각 멤버의 sizeof 합계와 같지 않은 이유는 무엇입니까?

예시 코드

#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));
}

출력 2

Size of struct: 16