Structures et alignement de données
Bonjour,
Dans un projet, des consignes nous imposent de "masquer l'implémentation des structures".
Mon binôme est arrivé à une structure de ce genre (on utilise des pointeurs de fonctions pour des raisons bien particulières) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| typedef struct ImplEnsembleColore {
TYPE * (* next)(GoshIterateur *, struct ImplEnsembleColore *, TYPE *);
GoshIterateur(*createIterateur)(void);
bool (*vide)(struct ImplEnsembleColore *);
void (*ajouter)(struct ImplEnsembleColore *, TYPE);
bool (*appartient)(struct ImplEnsembleColore *, TYPE);
#ifdef SHOW_IMPLEMENTATION_ENSEMBLE_COLORE
EnsemblePosition positions;
Couleur couleur;
#endif
} * EnsembleColore; |
Dans le .c, SHOW_IMPLEMENTATION_ENSEMBLE_COLORE sera défini et on pourra accéder à tous les champs.
Ailleurs, on ne pourra récupérer que les pointeurs de fonctions (les autres champs n'étant pas définis) de cette manière (EnsembleColore ne sera d'ailleurs jamais déférencé) :
Code:
1 2 3
| EnsembleColore foo;
// ....
foo->unDesPointeurs(); |
A mon grand étonnement, ce code compile ( j'étais pourtant sûr que l'éditeur de liens proférerait quelques insultes) mais je me demande s'il ne peut pas y avoir des problèmes avec "l'alignement".
En effet, dans une structure, tous les éléments sont dans l'ordre en mémoire mais pas forcément consécutif, le compilateur pouvant rajouter des octets de padding pour des raisons d'optimisations.
J'aimerai donc savoir, même si ce code fonctionne, si le comportement est bien défini par la norme.