308 votes

rembourrage et emballage de structure

 struct mystruct_A
{
   char a;
   int b;
   char c;
} x;

struct mystruct_B
{
   int b;
   char a;
} y;
 

la taille de la structure est de 12 et 8 respectivement.

Cette structure est-elle rembourrée ou emballée?

Quelqu'un peut-il me dire quand le rembourrage ou l'emballage a lieu?

365voto

Nikolai N Fetissov Points 52093

Rembourrage aligne les membres de structure "naturelle" de l'adresse de limites - dire, int membres ont compensations, qui sont mod(4) == 0 sur une plateforme 32 bits. Le rembourrage est activé par défaut. Il insère la suite de "lacunes" dans votre première structure:

struct mystruct_A {
    char a;
    char gap_0[3]; /* inserted by compiler: for alignment of b */
    int b;
    char c;
    char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;

D'emballage, d'autre part empêche le compilateur de faire padding - ce doit être explicitement demandée - sous GCC c'est __attribute__((__packed__)), donc la suivante:

struct __attribute__((__packed__)) mystruct_A {
    char a;
    int b;
    char c;
};

serait de produire une structure de la taille de l' 6 sur une architecture 32 bits.

Une note si - non alignés d'accès à la mémoire est plus lent sur des architectures qui permettent (comme x86 et amd64), et est explicitement interdite sur un strict alignement des architectures comme SPARC.

24voto

user2083050 Points 121

La Structure de l'emballage supprime structure de rembourrage, rembourrage utilisé lorsque l'alignement est le plus important, l'emballage utilisé lorsque l'espace est le plus important.

Certains compilateurs offrent #pragma pour supprimer le rembourrage ou pour en faire des paniers pour n un nombre d'octets. Certains offrent des mots clés pour ce faire. Généralement pragma qui est utilisé pour modifier la structure de rembourrage sera dans le format ci-dessous (dépend du compilateur):

#pragma pack(n)

Par exemple BRAS fournit l' __packed mot-clé à supprimer la structure de rembourrage. Passez par votre compilateur manuel pour en savoir plus à ce sujet.

Ainsi, une structure compacte est une structure sans rembourrage.

Généralement emballés structures seront utilisés

  • pour économiser de l'espace

  • pour formater une structure de données à transmettre sur le réseau à l'aide de certains protocole (ce n'est pas une bonne pratique car vous avez besoin de
    traiter avec endianness)

Si vous souhaitez des explications plus détaillées sur la structure de remplissage et d'emballage, veuillez vous référer à mon blog (lien original est maintenant un lien spammeur. Essayez la Wayback Machine version à la place.).

5voto

Le remplissage de la structure ajoute des bits supplémentaires à la fin de la structure, de sorte que la structure complète la limite de mot. ici, vous en apprendrez plus sur l’évitement du rembourrage de la structure http://clinuxpro.com/structure-padding

5voto

casablanca Points 41814

Remplissage et d'emballage ne sont que deux aspects de la même chose:

  • de l'emballage ou de l'alignement est la taille à laquelle chaque membre est arrondi
  • le remplissage est l'espace supplémentaire ajouté pour correspondre à l'alignement

En mystruct_A, en supposant un défaut d'alignement de 4, chaque membre est aligné sur un multiple de 4 octets. Puisque la taille de l' char est de 1, le rembourrage pour a et c 4 - 1 = 3 octets alors qu'aucun rembourrage est nécessaire pour int b ce qui est déjà 4 octets. Il fonctionne de la même manière pour l' mystruct_B.

1voto

nmichaels Points 21955

Le compactage de la structure n'est effectué que lorsque vous indiquez explicitement à votre compilateur de compresser la structure. Le rembourrage est ce que vous voyez. Votre système 32 bits remplit chaque champ avec l'alignement des mots. Si vous aviez demandé à votre compilateur d'empaqueter les structures, elles seraient respectivement de 6 et 5 octets. Ne fais pas ça quand même. Ce n'est pas portable et fait que les compilateurs génèrent du code beaucoup plus lent (et parfois même bogué).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X