sizeof (struct) différent pour différents compilateurs

En supposant que j’ai un code comme celui-ci:

#include  #include  int main(int argc, char *argv[]) { typedef struct{ uint16_t x : 9; uint8_t y : 7; } z; printf("sizeof(z) = %lu\n",sizeof(z)); } 

J’ai des résultats différents pour clang sur Mac (2) et quelqu’un m’a dit que cela revenait (3). Je ne sais pas si je le comprends bien, mais je vois que si le compilateur compresse d’abord la structure en 9 + 7 = 16 bits, l’autre utilise 16 bits de uint16_t et 8 de uint8_t. Pourriez-vous conseiller?

Je ne sais pas si je le comprends bien, mais je vois que si le compilateur compresse d’abord la structure en 9 + 7 = 16 bits, l’autre utilise 16 bits de uint16_t et 8 de uint8_t. Pourriez-vous conseiller?

La première chose à retenir à propos de bit-field est cette phrase de K & R, 2nd:

(6.9 Bit-fields) “Presque tout dans les champs dépend de la mise en oeuvre.”

Cela inclut le rembourrage, l’alignement et l’endianité des bits.

Deux problèmes possibles peuvent survenir:

Les champs de bits sont très mal standardisés dans la spécification ANSI C. Le compilateur choisit comment les bits sont alloués dans le conteneur de champs de bits. Vous devez éviter de les utiliser à l’intérieur de structures, mais vous pouvez utiliser #define ou enum.

Le deuxième problème possible est que le compilateur posera la structure en mémoire en ajoutant un rembourrage pour s’assurer que le prochain object est aligné sur la taille de cet object. Il est recommandé de placer les éléments de la structure en fonction de leur taille:

 typedef struct{ uint8_t x : 7; uint16_t y : 9; } z;