2017-05-19 1 views
0

Je suis en train de tenir quelques bitfields dans un 3 octets structstructure à taille bizarre avec bitfields

#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 

Cependant, sizeof DSTEntry est toujours 5, allthough la somme de tous les bits est 24. J'utilise gcc 5.3.0.

+5

Solution: n'utilisez pas de champs binaires en premier lieu. Ils sont brisés par la conception du langage. – Lundin

+0

Si vous utilisez 'uint16_t' au lieu de' uint8_t', alors la taille passera à 4. Je pense que vous n'avez aucune chance de l'abaisser à 3 cependant. –

+1

Impossible de reproduire. – luoluo

Répondre

0

Si vous avez la liberté de réorganiser les éléments de la structure, vous pouvez essayer ceci:

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; 

Cela a donné lieu à la taille 3 pour moi, avec gcc 4.9.2. Si les champs doivent rester dans cet ordre, alors je pense que le mieux que vous pouvez faire est de quatre octets avec:

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;