Réponse acceptée !
Un compilo en mode par défaut (le mieux pour l'alignement correct) va aligner chaque membre d'une struct en fonction de son type et donc de sa taille. Le niveau d'alignement est de plus déterminé par le choix de la plateforme ciblée à la compilation, c'est par exemple 8 sur processeur 32 bits compatible Intel.
Je fais volontairement abstraction du cas où on spécifie une compil avec SSE(1 et 2), tu te reporteras aux manuels Intel si le sujet t'intéresse (align 16 minimal, offset de 32 mini dans le code entre chaque accès aux registres SSE, etc etc...), très vaste sujet.
[ Lien ]Donc compil standard en mode 586:
- La struct (offset 0, le 1er membre) est alignée sur 8, transparent pour le développeur C.
- Chaque membre aura un alignement correspondant au minimum à sa taille:
-- 32 bits sur 4
-- double sur 8
-- 16 bits sur 2
-- 8 bits sur 1
Partant de cela, le compilo aura donc transcrit ainsi la 1ere struct:
typedef struct _GRIDA {
char coox;
char cooy;
char cadrage[2];
int value; // AINSI OK EST BIEN SUR 4
bool flag; // 1 octet en C++
char cadrage2[3]; // REMPLISSEUR MINIMAL POUR DONNEES SUIVANTES DU REGISTRE .data
} GRIDA;
ce qui fait logiquement sizeof = 12.
GRIDB ne se voit ajouter qu'1 seul octet de remplissage à la fin, ce qui fait bien 8 alors qu'on a bien les mêmes membres, simplement en ayant placé (aligné) correctement les données.
Ne pas croire que tout ceci est pure fantaisie des concepteurs de compilo, le choix est d'ailleurs laissé au developpeur de modifier l'alignement (#prama PACK()) mais c'est normalement à bannir dans un prog en mode user tant qu'on n'a pas à mettre une struct en conformité avec les specs d'un driver.
Un DWORD non aligné sur 4 par exemple et accédé directement (int x = tabInt[2]; par exemple => MOV asm) sera sanctinné par une faute d'alignement émise par le cpu (que Windows récupèrera seul comme un grand, Linux idem je crois) et restera transparent pour le développeur MAIS se traduira par des cycles de pénalité et réduira donc fortement les performances.
ciao...
[ Lien ]BruNews, MVP VC++