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

3개의 `unsigned short` 멤버가 있는 구조체에 대해 `sizeof(myStruct)`가 8바이트 대신 6바이트를 반환하는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-26 19:17:02
원래의
691명이 탐색했습니다.

Why does `sizeof(myStruct)` return 6 bytes instead of 8 bytes for a struct with three `unsigned short` members?

C 구조체의 메모리 정렬: 크기 불일치 이해

C 구조체로 작업할 때 메모리 정렬은 실제 크기를 결정하는 데 중요한 역할을 합니다. 메모리에 있는 구조체의 크기입니다. 메모리 정렬은 특정 경계로 나눌 수 있는 메모리 주소의 데이터 구조 배치를 나타냅니다. 이를 통해 효율적인 데이터 액세스와 성능 최적화가 보장됩니다.

메모리 정렬이 일반적으로 4바이트로 설정되는 32비트 시스템을 생각해 보세요. 이 맥락에서 다음과 같은 여러 개의 부호 없는 짧은 멤버로 구성된 구조체는 다음과 같습니다.

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;
로그인 후 복사

이 구조체의 메모리 크기는 8바이트(3 x 2바이트)가 될 것으로 예상됩니다. 그러나 sizeof(myStruct) 연산자는 6바이트만 반환합니다. 이러한 불일치는 정렬 요구 사항으로 인해 발생할 수 있습니다.

첫 번째 예에서는 각 짧은 멤버가 2바이트를 차지합니다. 정렬 경계가 4바이트이므로 멤버 사이에 패딩이 삽입되지 않습니다. 따라서 전체 크기는 6바이트로 유지됩니다.

반대로, 아래와 같이 구조체에 int 멤버를 도입하면 정렬 동작이 변경됩니다.

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;
로그인 후 복사

이 경우 int 멤버에는 4바이트 정렬 경계가 필요합니다. 이 요구 사항을 충족하기 위해 마지막 unsigned short 멤버(v3)와 int 멤버(i) 사이에 2바이트의 패딩이 삽입됩니다. 결과적으로 총 크기는 12바이트(Short의 데이터 6바이트, Padding의 2바이트, int의 데이터 4바이트)가 됩니다.

따라서 두 구조체 간의 메모리 크기 차이는 다음에서 발생합니다. 회원 유형의 정렬 요구 사항. 첫 번째 구조체에서는 짧은 멤버 자체가 정렬 경계를 충족하는 반면, 두 번째 구조체에서는 int 멤버의 정렬 경계를 충족하기 위해 추가 패딩이 필요합니다.

위 내용은 3개의 `unsigned short` 멤버가 있는 구조체에 대해 `sizeof(myStruct)`가 8바이트 대신 6바이트를 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!