/* 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.