Alignement en mémoire
En informatique, les contraintes d'alignement en mĂ©moire limitent Ă certains multiples d'adresse mĂ©moire, oĂč certaines donnĂ©es et instructions machine peuvent ĂȘtre enregistrĂ©es. En outre, les optimisations d'alignement mĂ©moire permettent d'influencer la vitesse d'exĂ©cution d'un programme uniquement en choisissant bien les adresses.
Principe
Pour augmenter leurs performances, les processeurs sont souvent reliés à la mémoire vive par un bus de données plus large que la granularité de leur adressage : par exemple un processeur est capable d'adresser individuellement des octets (8 bits), relié à la mémoire par un bus de 4 octets (32 bits). Si une donnée de 4 octets ne se trouve pas à une adresse divisible par 4, alors, selon le modÚle de processeur, il y a :
- violation de contrainte : une erreur d'alignement interrompt l'exécution des instructions ;
- alignement non optimal : deux fois 4 octets bien alignés sont lus, puis les 4 octets mal alignés sont extraits de ces 8 octets, ce qui prend bien plus de temps que lire 4 octets bien alignés.
La rÚgle généralement applicable pour qu'une donnée soit bien alignée, est qu'elle se trouve à une adresse divisible par sa taille. Ainsi, une donnée occupant un seul octet est toujours bien alignée, une donnée de deux octets est bien alignée si elle est à une adresse paire, une donnée de 4 octets est bien alignée si elle est à une adresse divisible par 4, etc. Toutefois, la contrainte d'alignement n'excÚde pas le matériel sous-jacent.
Les contraintes d'alignement en mémoire dépendent de l'architecture du processeur. L'optimisation de l'alignement est plus subtil, car il peut dépendre de la mémoire cache du processeur, de la pagination de la mémoire virtuelle, et autres caractéristiques de l'accÚs à la mémoire. Certains compilateurs permettent d'influencer l'alignement des données.
Pratique
Instructions
Les processeurs RISC n'ont gĂ©nĂ©ralement qu'une seule taille d'instruction machine, et ces instructions doivent ĂȘtre bien alignĂ©es. En revanche, les processeurs CISC ont des instructions de tailles variables. Il peut donc parfois ĂȘtre bĂ©nĂ©fique pour les performances d'insĂ©rer une opĂ©ration sans effet (souvent appelĂ©e nop
) afin que les instructions suivantes soient mieux alignées.
Données
Lorsque des donnĂ©es de tailles diffĂ©rentes sont enregistrĂ©es en mĂ©moire les unes Ă la suite des autres, il peut ĂȘtre utile, voire nĂ©cessaire, de laisser des trous entre elles afin qu'elles soient toutes bien alignĂ©es. Cela s'observe notamment sur la pile d'exĂ©cution et dans les types de donnĂ©e composĂ©s.
Type de donnée composé en C
Soient deux types de donnée composés en langage C en considérant un matériel disposant d'un bus d'adressage de 64 bits (8 octets) :
struct no_align
{
char c;
double d;
int i;
char c2[3];
};
struct align
{
double d;
int i;
char c2[3];
char c;
};
Les deux structures contiennent les mĂȘmes membres. On pourrait donc en dĂ©duire qu'elles ont la mĂȘme taille. Ainsi, en faisant l'hypothĂšse que :
- le type
char
fait 1 octet ; - le type
int
fait 4 octets ; - le type
double
fait 8 octets.
la taille totale serait de 1 + 8 + 4 + 3 Ă 1 = 16 octets.
Or si l'on affiche la taille avec l'instruction printf("%zu %zu\n", sizeof(struct no_align), sizeof(struct align));
on a de bonnes chances d'obtenir 24 et 16 octets. En effet les membres de la structure align
sont bien alignés, mais pas ceux de no_align
. Le compilateur rajoute des octets de remplissage (padding en anglais) pour respecter l'alignement. Une fois compilé, no_align
ressemble Ă ceci :
struct no_align_compile
{
char c;
char __pad1[7];
double d;
int i;
char c2[3];
char __pad2;
};
On remarque que __pad1
permet Ă d
de débuter à une adresse multiple de 8, et __pad2
complĂšte la structure pour atteindre 24, un multiple de 8.
Options de compilation
Avec GCC, l'option -Wpadded
permet de savoir si une structure nĂ©cessite du padding pour ĂȘtre alignĂ©e. Voici les messages obtenus lors de la compilation de struct no_align
:
Warning padding struct to align 'd' Warning padding struct size to alignment boundary
Bibliographie
- (en) C A Reference Manual, 5e Ă©dition, Samuel P. Harbison III, Guy L. Steel Jr., Prentice Hall, 2002
- §6.1.3 Alignement Restrictions
- §5.6.7 Sizes of Structures
- (en) GCC 4.9.2 Manual, §3.8 Options to Request or Suppress Warnings