Utilisateur:Poil/alignement

Un article de Wikipédia, l'encyclopédie libre.

/* Quick hack pour servir d'exemple sur les alignements forces des
   objets dans une structure.  

   Nota bene : le code qui suit fait aux possibilites de
   concatenations et creations de chaine par CPP.
   et
   Le code a la particularite de n'allouer *aucun* objet.

   Code (c)opyleft Stephane Tsacas, pour la Wikipedia. 
   mercredi 27 avril 2005.
*/

struct salade {
  char octet;
  short court;
  long entier;
  void *pointeur;
  long long entier_long;
  float flottant;
  double flottant_double;
  char octet2;
};

struct mauvais {
  char octet;
  short court;
  char octet2;
  short court2;
};

#define alignement(structure, champ) \
  (unsigned int) &(((struct structure *)0)->champ)

#define print(s, c) printf("%s taille %d indice %d dans la structure %s.\n", \
  #c, sizeof(((struct s *)0)->c), alignement(s, c), #s)

#define printsize(s) printf("Taille de la structure " #s " %d\n", \
  sizeof(struct s))

#define defstruct(type) \
  struct align_ ## type { char octet; type objet; }

#define print_alignement(type) \
  { \
    defstruct(type); \
    printf("objet de type %6s aligne sur une adresse multiple de %d\n", \
           #type, alignement(align_ ## type, objet)); \
   }

int
main() {
  printf("\n");
  print_alignement(char);
  print_alignement(short);
  print_alignement(long);
  print_alignement(float);
  print_alignement(double);
  printf("\n");

  printsize(salade);
  print(salade, octet);
  print(salade, court);
  print(salade, entier);
  print(salade, pointeur);
  print(salade, entier_long);
  print(salade, flottant);
  print(salade, flottant_double);
  print(salade, octet2);
  printf("\n");

  printsize(mauvais);
  print(mauvais, octet);
  print(mauvais, court);
  print(mauvais, octet2);
  print(mauvais, court2);

  return 0;
}


$ gcc -O3 -m32 align.c && a.out

objet de type   char aligne sur une adresse multiple de 1
objet de type  short aligne sur une adresse multiple de 2
objet de type   long aligne sur une adresse multiple de 4
objet de type  float aligne sur une adresse multiple de 4
objet de type double aligne sur une adresse multiple de 8

Taille de la structure salade 48
octet taille 1 indice 0 dans la structure salade.
court taille 2 indice 2 dans la structure salade.
entier taille 4 indice 4 dans la structure salade.
pointeur taille 4 indice 8 dans la structure salade.
entier_long taille 8 indice 16 dans la structure salade.
flottant taille 4 indice 24 dans la structure salade.
flottant_double taille 8 indice 32 dans la structure salade.
octet2 taille 1 indice 40 dans la structure salade.

Taille de la structure mauvais 8
octet taille 1 indice 0 dans la structure mauvais.
court taille 2 indice 2 dans la structure mauvais.
octet2 taille 1 indice 4 dans la structure mauvais.
court2 taille 2 indice 6 dans la structure mauvais.

$ gcc -O3 -m64 align.c && a.out

objet de type   char aligne sur une adresse multiple de 1
objet de type  short aligne sur une adresse multiple de 2
objet de type   long aligne sur une adresse multiple de 8
objet de type  float aligne sur une adresse multiple de 4
objet de type double aligne sur une adresse multiple de 8

Taille de la structure salade 56
octet taille 1 indice 0 dans la structure salade.
court taille 2 indice 2 dans la structure salade.
entier taille 8 indice 8 dans la structure salade.
pointeur taille 8 indice 16 dans la structure salade.
entier_long taille 8 indice 24 dans la structure salade.
flottant taille 4 indice 32 dans la structure salade.
flottant_double taille 8 indice 40 dans la structure salade.
octet2 taille 1 indice 48 dans la structure salade.

Taille de la structure mauvais 8
octet taille 1 indice 0 dans la structure mauvais.
court taille 2 indice 2 dans la structure mauvais.
octet2 taille 1 indice 4 dans la structure mauvais.
court2 taille 2 indice 6 dans la structure mauvais.