Alignement en mémoire

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuis Alignement de données)
Aller à : Navigation, rechercher

En informatique, l'alignement en mémoire est la façon dont les données et les instructions en langage machine sont organisées en mémoire.

[modifier] Principe

Pour augmenter leurs performances, les processeurs sont souvent reliés à la mémoire vive par un bus plus large que la granularité de leur adressage : ainsi, un processeur capable d'adresser des octets est relié à la mémoire par un bus de 32 bits, soit 4 octets. Si une donnée de 4 octets ne se trouve pas à une adresse divisible par 4, alors il faut deux accès à la mémoire pour l'atteindre, ce qui est plus lent, et cause même une erreur d'alignement dans la plupart des processeurs.

Pour éviter les pertes de performance et les problèmes, les données sont donc alignées avec des multiples de 2, 4, 8… selon les caractéristiques du processeur cible.

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

[modifier] 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 membres, on pourrait croire qu'elles ont la même taille. Et faisant l'hypothèse que :

  • le type char fait 1 octet ;
  • le type int fait 4 octets ;
  • le type double fait 8 octets.

alors taille totale pourrait être de 1 + 8 + 4 + 3 × 1 = 16 octets. Or la taille observée est de:

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

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

Avec 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
Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Contribuer
Imprimer / exporter
Boîte à outils
Autres langues