2017-05-19 85 views
0

我想滿足一些位域爲3個字節的結構與位域奇數尺寸結構

#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 

然而,的sizeof DSTEntry始終是5,allthough所有位的總和是24 我使用gcc 5.3.0。

+5

解決方案:不要使用位字段。他們被語言設計所打破。 – Lundin

+0

如果你使用'uint16_t'而不是'uint8_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; 

這導致了我的尺寸3,用gcc 4.9.2。如果字段必須保持這個順序,那麼我認爲你可以做的最好的是四個字節:

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;