> 백엔드 개발 > C++ > 본문

C/C++에서 구조의 크기가 각 멤버의 크기의 합과 같지 않은 이유는 무엇입니까?

PHPz
풀어 주다: 2023-08-26 09:29:07
앞으로
833명이 탐색했습니다.

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

사례 1

이 경우 double z의 길이는 8바이트로 x(4바이트)보다 큽니다. 따라서 또 다른 4바이트의 패딩이 추가됩니다. 추가적으로, short 타입 데이터 y는 메모리 공간이 2바이트이므로 패딩으로 6바이트가 추가됩니다.

C/C++에서 구조의 크기가 각 멤버의 크기의 합과 같지 않은 이유는 무엇입니까?

예제 코드

#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바이트의 공간을 차지하게 됩니다.

C/C++에서 구조의 크기가 각 멤버의 크기의 합과 같지 않은 이유는 무엇입니까?

예제 코드

#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 데이터 뒤에는 패딩이 있지만 정수 데이터 뒤에는 패딩이 없습니다.

C/C++에서 구조의 크기가 각 멤버의 크기의 합과 같지 않은 이유는 무엇입니까?

예제 코드

#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
로그인 후 복사
로그인 후 복사

위 내용은 C/C++에서 구조의 크기가 각 멤버의 크기의 합과 같지 않은 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:tutorialspoint.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿