>  기사  >  백엔드 개발  >  짧은 멤버가 있는 C 구조체의 크기가 항상 멤버 크기의 배수가 아닌 이유는 무엇입니까?

짧은 멤버가 있는 C 구조체의 크기가 항상 멤버 크기의 배수가 아닌 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-26 13:00:29601검색

Why is the size of a C struct with short members not always a multiple of the member size?

C 구조체의 메모리 정렬 이해

메모리 정렬은 C 프로그래밍에서 중요한 개념입니다. 이는 데이터가 메모리에 저장되는 방식과 프로세서에 의해 액세스됩니다. 구조체의 맥락에서 메모리 정렬은 구조체의 개별 멤버가 메모리에 배치되는 방식을 나타냅니다.

다음 구조체를 고려하세요.

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;</code>

메모리 정렬이 이루어지는 32비트 시스템에서 일반적으로 4바이트로 설정되므로 이 구조체의 전체 크기는 8바이트가 될 것으로 예상됩니다. 그러나 sizeof(myStruct) 연산자는 6바이트만 반환합니다.

부호 없는 short인 구조체의 각 멤버의 크기가 2바이트이기 때문에 불일치가 발생합니다. 모든 멤버의 크기가 동일하므로 멤버 사이에 패딩이 삽입되지 않습니다. 결과적으로 구조체는 메모리에서 6바이트를 차지합니다.

이제 구조체를 수정해 보겠습니다.

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;</code>

이 경우 크기가 다음과 같은 int 멤버가 있습니다. 4바이트, 구조체의 메모리 정렬을 변경합니다. int 멤버는 4바이트 경계에 정렬되어야 합니다. 앞에 6바이트가 있으므로 v3와 i 사이에 2바이트의 패딩이 삽입됩니다. 이는 sizeof(myStruct)로 확인된 대로 구조체의 전체 크기를 12바이트로 가져옵니다.

요약하면 C 구조체의 메모리 정렬은 멤버가 메모리에 올바르게 정렬되어 프로세서 성능을 최적화하고 메모리 사용량을 줄이도록 보장합니다. . 유형은 유형 자체만큼 큰 경계에만 정렬됩니다. 더 큰 유형이 도입되면 전체 구조체에 대한 정렬이 설정되고 잠재적으로 원하는 정렬을 유지하기 위해 패딩이 도입됩니다.

위 내용은 짧은 멤버가 있는 C 구조체의 크기가 항상 멤버 크기의 배수가 아닌 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.