Agrégats et unions
D'autres types tels que les tableaux, les structures et les unions ont des exigences plus strictes en matière d'alignement qui garantissent la cohérence du stockage d'agrégat et d'union ainsi que de la récupération des données. Voici les définitions des termes « tableau », « structure » et « union » :
Tableau
Contient un groupe ordonné d'objets de données adjacents. Chaque objet est appelé élément. Tous les éléments contenus dans un tableau ont une taille et un type de données identiques.Structure
Contient un groupe ordonné d'objets de données. Contrairement aux éléments d'un tableau, les objets de données contenus dans une structure peuvent avoir des types de données et des tailles différents. Chaque objet de données contenu dans une structure est appelé membre.Union
Objet contenant l'un des jeux de membres nommés. Les membres du jeu nommé peuvent être de tout type. Le stockage alloué pour une union est égal au stockage requis pour le plus grand membre de cette union, plus tout remplissage requis pour l'alignement.
Le tableau suivant indique l'alignement vivement recommandé pour les membres scalaires d'unions et de structures.
Type scalaire |
Type de données C |
Alignement requis |
INT8 |
char |
Byte |
UINT8 |
unsigned char |
Byte |
INT16 |
short |
Word |
UINT16 |
unsigned short |
Word |
INT32 |
int, long |
Doubleword |
UINT32 |
unsigned int, unsigned long |
Doubleword |
INT64 |
__int64 |
Quadword |
UINT64 |
unsigned __int64 |
Quadword |
FP32 (simple précision) |
float |
Doubleword |
FP64 (double précision) |
double |
Quadword |
POINTER |
* |
Quadword |
__m64 |
struct __m64 |
Quadword |
__m128 |
struct __m128 |
Octaword |
Les règles suivantes d'alignement d'agrégats s'appliquent :
L'alignement d'un tableau est identique à l'alignement de l'un des éléments qu'il contient.
L'alignement du début d'une structure ou d'une union est l'alignement maximal de tout membre individuel. Chaque membre contenu dans la structure ou l'union doit être placé à son propre alignement comme défini dans le tableau précédent qui peut exiger un remplissage interne implicite selon le membre précédent.
La taille de la structure doit être un multiple intégral de son alignement, qui peut exiger un remplissage après le dernier membre. Comme les structures et les unions peuvent être regroupées dans des tableaux, chaque élément de tableau d'une structure ou d'une union doit commencer et se terminer à l'alignement correct déterminé précédemment.
Il est possible d'aligner des données afin qu'elles excèdent les exigences en matière d'alignement aussi longtemps que les règles précédentes sont conservées.
Un compilateur individuel peut ajuster l'emballage d'une structure pour des raisons de taille. Par exemple, /Zp (Alignement des membres de la structure) permet d'ajuster l'emballage de structures.