Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Alignement et Remplissage dans les Structs | Compréhension des Structs et de la Mémoire
Maîtriser les Structs en C

bookAlignement et Remplissage dans les Structs

Alignement

Chaque champ d'une structure est aligné sur une frontière qui est un multiple de la taille du plus grand élément de la structure.

Par exemple, si le plus grand élément a une taille de 4 octets, alors chaque élément sera aligné sur une frontière de 4 octets.

Cela permet d'accélérer l'accès à la mémoire et d'éviter les problèmes d'alignement matériel.

main.c

main.c

copy
1234567891011121314151617181920
#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }

Vous pourriez vous demander pourquoi la taille de struct Example est de 16 octets, même si chaque champ est aligné sur la frontière du type le plus grand, qui est de 8 octets. À première vue, aligner les trois champs sur 8 octets pourrait suggérer une taille totale de 24 octets. En réalité, cela fonctionne un peu différemment.

Le premier champ a est un char et occupe 1 octet. Pour s'assurer que le champ suivant b de type int commence à une frontière de 4 octets, le compilateur ajoute 3 octets de remplissage après a. Le champ b lui-même occupe 4 octets et est maintenant correctement aligné.

Le champ suivant c est un double et doit commencer à une frontière de 8 octets. Le compilateur ajoute un remplissage après b pour placer c à la bonne adresse. Le champ c occupe 8 octets.

Au total : 1 octet pour a + 3 octets de remplissage + 4 octets pour b + 8 octets pour c = 16 octets. Les règles d'alignement sont respectées et la mémoire est utilisée efficacement.

question mark

Pourquoi la taille d'une struct dépasse-t-elle souvent la somme des tailles de ses champs individuels ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 3. Chapitre 2

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

bookAlignement et Remplissage dans les Structs

Glissez pour afficher le menu

Alignement

Chaque champ d'une structure est aligné sur une frontière qui est un multiple de la taille du plus grand élément de la structure.

Par exemple, si le plus grand élément a une taille de 4 octets, alors chaque élément sera aligné sur une frontière de 4 octets.

Cela permet d'accélérer l'accès à la mémoire et d'éviter les problèmes d'alignement matériel.

main.c

main.c

copy
1234567891011121314151617181920
#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }

Vous pourriez vous demander pourquoi la taille de struct Example est de 16 octets, même si chaque champ est aligné sur la frontière du type le plus grand, qui est de 8 octets. À première vue, aligner les trois champs sur 8 octets pourrait suggérer une taille totale de 24 octets. En réalité, cela fonctionne un peu différemment.

Le premier champ a est un char et occupe 1 octet. Pour s'assurer que le champ suivant b de type int commence à une frontière de 4 octets, le compilateur ajoute 3 octets de remplissage après a. Le champ b lui-même occupe 4 octets et est maintenant correctement aligné.

Le champ suivant c est un double et doit commencer à une frontière de 8 octets. Le compilateur ajoute un remplissage après b pour placer c à la bonne adresse. Le champ c occupe 8 octets.

Au total : 1 octet pour a + 3 octets de remplissage + 4 octets pour b + 8 octets pour c = 16 octets. Les règles d'alignement sont respectées et la mémoire est utilisée efficacement.

question mark

Pourquoi la taille d'une struct dépasse-t-elle souvent la somme des tailles de ses champs individuels ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 3. Chapitre 2
some-alt