비트 필드를 할당한 구조체의 바이트 크기

조회수 875회
typedef struct _BITFIELD {
    unsigned int a : 1;
    unsigned int b : 3;
    unsigned int c : 7;
    unsigned int d : 33;
} BitField;

int main() {
    printf("%d byte(s)\n", (int)sizeof(BitField));  // 12 byte(s)
    return 0;
}

네 개의 멤버변수에 각각 1, 3, 7, 33비트를 할당한 구조체입니다.

이 구조체의 크기를 확인해 보면 12바이트가 반환되는데, 어떻게 12바이트가 나오는 건지 모르겠네요. 1+3+7=11비트이고, 33은 unsigned int의 크기를 초과하니 32비트로 줄여서 할당하면 11+32=43비트가 될 것 같은데 그건 아니네요.

그렇다고 4바이트 unsigned int x 4를 해서 16바이트인 것도 아니구요.

12바이트는 어떻게 계산되는 건가요? 컴파일 환경은 x64 Linux, gcc 7.3.0입니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • unsigned int d : 33;
    

    4바이트 크기인 32비트를 넘어버렸으니 8바이트가 할당됩니다.

    unsigned int a : 1;
    unsigned int b : 3;
    unsigned int c : 7;
    

    에 4바이트가 할당됩니다.

    즉 _BITFIELD 구조체는 12바이트를 할당받습니다.

    • 답변 감사합니다. 그런데 a, b, c에 32비트가 어떻게 할당되는 건가요? 합하면 11비트인데... 알 수 없는 사용자 2019.3.15 00:54
    • 성능상의 이유로 4바이트로 연산하도록 패딩비트를 삽입합니다. 물론 #pragma pack 선언으로 컨트롤이 가능합니다. 정영훈 2019.3.15 16:19

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)