Alignement en mémoire

Alignement en mémoire

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.

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.

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)

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

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Alignement en mémoire de Wikipédia en français (auteurs)

Игры ⚽ Поможем решить контрольную работу

Regardez d'autres dictionnaires:

  • Alignement De Données — L Alignement de données est la façon dont les données sont organisées en mémoire. En effet, 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… …   Wikipédia en Français

  • Alignement de donnees — Alignement de données L Alignement de données est la façon dont les données sont organisées en mémoire. En effet, en informatique, les compilateurs sont souvent obligés, pour des raisons de performance et pour faciliter l exécution du code d… …   Wikipédia en Français

  • Alignement de données — L Alignement de données est la façon dont les données sont organisées en mémoire. En effet, 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… …   Wikipédia en Français

  • Memoire de traduction — Mémoire de traduction Une mémoire de traduction est une base de données contenant des segments de texte ainsi que l équivalent de ces segments dans une autre langue. Elle permet de stocker des segments de phrase et de les réutiliser. On parle… …   Wikipédia en Français

  • Mémoire De Traduction — Une mémoire de traduction est une base de données contenant des segments de texte ainsi que l équivalent de ces segments dans une autre langue. Elle permet de stocker des segments de phrase et de les réutiliser. On parle dans ce cas de traduction …   Wikipédia en Français

  • Mémoire de traduction — Une mémoire de traduction est une base de données contenant des segments de texte ainsi que l équivalent de ces segments dans une autre langue. Elle permet de stocker des segments de phrase et de les réutiliser. On parle dans ce cas de traduction …   Wikipédia en Français

  • Fibromyalgie — Classification internationale des maladies CIM 10 : M79.7 (ICD9 = 729.1) La fibromyalgie, ou syndrome polyalgique idiopathique diffus (SPID), est une maladie caractérisée par un état douloureux musculaire chronique (myalgies diffuses) étendu ou… …   Wikipédia en Français

  • Axiomes De Plans Projectifs/Suite Des Axiomes — Article principal : Axiomes de plans projectifs. La géométrie projective a permis de s abstraire des impressions intuitives de la géométrie plane euclidienne. La géométrie projective ne travaille que sur les alignements et les intersections …   Wikipédia en Français

  • Axiomes de plans projectifs/Suite des axiomes — Article principal : Axiomes de plans projectifs. La géométrie projective a permis de s abstraire des impressions intuitives de la géométrie plane euclidienne. La géométrie projective ne travaille que sur les alignements et les intersections …   Wikipédia en Français

  • Axiomes de plans projectifs/suite des axiomes — Article principal : Axiomes de plans projectifs. La géométrie projective a permis de s abstraire des impressions intuitives de la géométrie plane euclidienne. La géométrie projective ne travaille que sur les alignements et les intersections …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”