Main menu:

Site search

Categories

février 2009
L M M J V S D
 1
2345678
9101112131415
16171819202122
232425262728  

Archive

C++ – Alignement des structures

Vous devez toujours garder à l’esprit cette notion d’alignement parce que la taille réelle d’une structure ou d’une classe n’est pas toujours celle que vous imaginez.
Prenons l’exemple de cette structure:

struct A
{
  int i;
  char c;
}a;

Le résultat de sizeof(a) donnera 8 octets alors que seulement 5 octets sont utilisés. Le reste, c’est l’alignement (padding en anglais). Le compilateur essaie toujours de garder l’alignement sur un multiple de quad-word (quatre mots, un mot étant égal à deux octets). Ceci est en tout cas valable pour les PC avec un OS 32 bits et dépend de l’implémentation.

struct A
{
  int i;
  char c1;
  char c2;
  char c3;
  char c4;
}a;

Dans ce cas, la réponse de sizeof(a) est aussi 8 octets et nous avons effectivement 8 octets d’utilisés.

Il est possible, lorsque la structure des données doit impérativement être alignée sur sa valeur réelle ou sur une autre valeur que des multiples de quatre mots, de dire au compilateur de changer ce comportement par défaut. Mais il est important de savoir que si le compilateur utilise ce type d’alignement sur des mots de quatre mots (8 octets), c’est parce que le processeur a plus de facilité à traiter cette taille de données. Le processeur dispose de registres et d’instructions rapides pour traiter les données alignées de cette façon. Si vous modifiez l’alignement, ceci aura un impact non-négligeable sur les performances de votre application. Autrement dit celle-ci sera notablement plus lente si vous traitez un grand nombre de structures de données.

struct A
{
    int i;
    char c1;
}__attribute__((packed));

L’attribut packed donné à la structure donne injonction au compilateur d’aligner la structure sur sa taille réelle. Ici, la réponse de sizeof(a) donnerait 5 octets.

struct A
{
    int i;
    char c1;
}__attribute__((aligned(x)));

Remplacez x par la valeur que vous souhaitez et le compilateur alignera la structure sur la valeur que vous avez spécifiée.