Qu'est-ce que Alignement et remplissage (padding) ?

Le fait de placer les données à des adresses multiples d'un nombre fixé pour chaque type (alignement), et les octets inutilisés insérés pour cela entre les données ou après elles (remplissage, ou padding). Dans un environnement où int est aligné sur une frontière de 4 octets, struct { char c; int i; char d; } reçoit 3 octets après c et 3 octets après d, pour une taille de 12 octets. Lire ou écrire à une adresse mal alignée est plus lent sur certains processeurs et provoque une exception sur d'autres. Ranger les membres du type le plus grand au plus petit réduit le padding.

Nom japonais: アライメントとパディング

« Alignement et remplissage (padding) » apparaît dans 2 questions d'entraînement réparties sur 2 thèmes, dont ISA et assembleur, Bases de la programmation en C.

Domaine: Bases de la programmation en C

S'entraîner : questions sur Alignement et remplissage (padding)

En RISC-V, si l'adresse d'une instruction lw lisant 4 octets n'est pas un multiple de 4 (non alignée), que peut-il se passer ?

  1. AL'instruction est automatiquement redirigée vers l'adresse multiple de 4 suivante et lit toujours correctement à la même vitesse
  2. BSelon l'implémentation du CPU, une exception peut survenir, ou l'accès peut être traité par le matériel ou le logiciel avec une forte lenteur
  3. CLes 2 bits de poids faible de l'adresse sont ignorés et aucune erreur ne survient
Afficher la réponse et l'explication

Réponse : B. Selon l'implémentation du CPU, une exception peut survenir, ou l'accès peut être traité par le matériel ou le logiciel avec une forte lenteur

Une donnée de 4 octets placée à une adresse multiple de 4 se lit en un seul accès mémoire. Si elle franchit une frontière, deux accès sont nécessaires ; RISC-V laisse donc à l'implémentation le choix de traiter les accès non alignés par le matériel ou de lever une exception pour les confier au logiciel. Dans ce dernier cas, l'accès est plus lent de plusieurs ordres de grandeur. C'est pourquoi les compilateurs insèrent des octets de remplissage (padding) entre les membres des structs pour les aligner.

« Alignement et remplissage (padding) » dans les explications

Questions mentionnant « Alignement et remplissage (padding) » (2)

  1. En RISC-V, si l'adresse d'une instruction lw lisant 4 octets n'est pas un multiple de 4 (non alignée), que peut-il se passer ?
  2. On considère un environnement courant où char fait 1 octet et int 4 octets, et où les int sont placés à des adresses multiples de 4. Quelle est la sortie obtenue en exécutant le code ci-dessus ?

Termes associés

struct (structure C) Tableau Allocation dynamique de mémoire Champ de bits (bit-field) Comportement indéfini (undefined behavior) Débordement de tampon (buffer overflow) Fuite de mémoire (memory leak) Macro (#define) Pointeur Pointeur de fonction

Retour au glossaire