Alignement de données

Un article de Wikipédia, l'encyclopédie libre.

Sommaire

[modifier] Introduction

En informatique, les compilateurs sont souvent obligés, pour des raisons de performance et pour faciliter l'exécution du code d'aligner les données en mémoire.

Un type de donnée de taille n doit être placé à une adresse multiple de n.

La taille d'une structure est multiple de la taille du processeur (32 bits le plus souvent).

[modifier] Exemple

Prenons un exemple en langage C

Soit deux structures de données :

typedef struct _noalign
{
    char c;
    double d;
    int i;
    char c2[3];
}noalign;
 
typedef struct _align
{
    double d;
    int i;
    char c2[3];
    char c;
}align;

Les deux structures contiennent les mêmes champs, on pourrait croire qu'elles ont la même taille. Et sachant que :

les champs de type char sont codés sur 1 octet,
les champs de type int sont codés sur 4 octets,
les champs de type double sont codés sur 8 octets.

(pour un compilateur sur une architecture et un système d'exploitation donné)

La taille totale devrait être 1+8+4+3*1 = 16 octets

or

printf("noalign %d\n",sizeof(noalign));
printf("align %d\n",sizeof(align));

affichent respectivement 24 et 16.

En effet la structure align est bien alignée mais pas noalign.

Le compilateur rajoute des bits dits de "padding" pour respecter l'alignement. En fait, noalign ressemble à ceci

typedef struct _noalign_corrige
{
    char c;
    char _pad1[7];
    double d;
    int i;
    char c2[3];
    char _pad2;
}noalign_corrige;

On remarque que _pad1 permet à d de débuter à une adresse multiple de 8. _pad2 complète la structure pour atteindre 24 (multiple de la taille du processeur)

[modifier] Compilateur

Sous gcc l'option -Wpadded permet de savoir si une structure est alignée ou pas.

Voici les messages obtenus lors de la compilation de la structure noalign

Warning padding struct to align 'd' 
Warning padding struct size to alignment boundary

[modifier] Conclusion

L'alignement de donnée dépend fortement de l'architecture et du compilateur. Il est important de connaitre ces problèmes surtout lorsque la place mémoire est importante ainsi que pour la communication entre deux architectures différentes.

D'une manière générale, lors de déclarations consécutives de variables, préférez déclarer d'abord les variables occupant le plus de mémoire, dans la mesure du possible.

Autres langues