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 멤버의 정렬 경계를 충족하기 위해 추가 패딩이 필요합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3