Структура нечетного размера с битовыми полями

Я пытаюсь вписать несколько битовых полей в 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

Однако размер DSTEntry всегда равен 5, хотя сумма всех битов равна 24. Я использую gcc 5.3.0.

1 ответ

Если у вас есть свобода перестановки элементов в структуре, вы можете попробовать это:

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;
Другие вопросы по тегам