Alignement 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
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.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Génial!
Completion taux amélioré à 4.35
Alignement 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
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.
Merci pour vos commentaires !