2017-05-19 13 views
0

I는 DSTEntry 항상 5는 sizeof 모든 비트의 합 allthough,이상한 크기의 구조

#pragma pack(push, 1) 
typedef struct _DSTEntry { 
    uint8_t reserved :6; 
    uint8_t startMonth:4; 
    uint8_t startDay:5; 
    uint8_t endMonth:4; 
    uint8_t endDay:5; 
} __attribute__((packed)) DSTEntry; 
#pragma pop 

그러나 3 바이트 구조체에 약간의 비트 필드에 맞도록 시도하고있다 gcc 5.3.0. 이 구조의 요소를 재 배열 할 수있는 자유가있는 경우

+5

해결책 : 처음에는 비트 필드를 사용하지 마십시오. 언어 디자인에 의해 깨졌습니다. – Lundin

+0

'uint8_t' 대신에'uint16_t'을 사용하면 크기는 4로 떨어질 것입니다. 당신이 3으로 내려갈 기회가 없다고 생각합니다. –

+1

재생할 수 없습니다. – luoluo

답변

0

, 당신이 시도 할 수 있습니다 :

typedef struct _DSTEntry { 
    uint16_t reserved :6; 
    uint16_t startDay:5; 
    uint16_t endDay:5; 
    uint8_t startMonth:4; 
    uint8_t endMonth:4; 
} __attribute__((packed)) DSTEntry; 

이것은 GCC 4.9.2로, 나를 위해 크기 3의 결과. 필드가 그 순서대로 유지되어야한다면 다음과 같이 4 바이트를 사용하는 것이 가장 좋습니다.

typedef struct _DSTEntry { 
    uint16_t reserved :6; 
    uint16_t startDay:5; 
    uint16_t startMonth:4; 
    uint8_t endDay:5; 
    uint8_t endMonth:4; 
} __attribute__((packed)) DSTEntry;