La Structure de remplissage et d'emballage
Considérer:
struct mystruct_A
{
char a;
int b;
char c;
} x;
struct mystruct_B
{
int b;
char a;
} y;
La taille des structures sont au nombre de 12 et 8, respectivement.
Sont ces structures collier ou emballés?
Quand rembourrage ou de l'emballage prendre place?
- Lire stackoverflow.com/questions/119123/...
- L'Art Perdu de la Structure C Emballage - catb.org/esr/structure-packing
padding
fait les choses en grand.packing
rend les choses plus petites. Totalement différent.
Vous devez vous connecter pour publier un commentaire.
Rembourrage aligne membres de structure "naturelles" de l'adresse de limites - dire,
int
membres ont compensations, qui sontmod(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: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:serait de produire une structure de taille
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 strict alignement des architectures comme SPARC.
Je sais que cette question est ancienne et plus de réponses ici, explique rembourrage très bien, mais tout en essayant de comprendre moi-même j'ai pensé avoir un "visuel" à l'image de ce qui se passe aidé.
Le processeur lit le mémoire en "morceaux" d'une certaine taille (word). Dire que le processeur de parole est de 8 octets de long. Il va regarder la mémoire comme une grande rangée de 8 octets, blocs de construction. Chaque fois qu'il a besoin d'obtenir certaines informations de la mémoire, il va arriver un de ces blocs et obtenir.
Comme semblent dans l'image ci-dessus, n'a pas d'importance où un Char (1 octet de long), puisqu'il sera à l'intérieur de l'un de ces blocs, nécessitant le CPU pour traiter seulement 1 mot.
Quand on a affaire à des données de plus d'un octet, comme un 4 octets int ou un 8 octets double, la façon dont ils sont alignées dans la mémoire fait une différence sur le nombre de mots qui devront être traitées par le PROCESSEUR. Si les 4 octets les morceaux sont alignés de manière à ce qu'ils conviennent toujours à l'intérieur d'un bloc (adresse mémoire étant un multiple de 4), un seul mot devra être traité. Sinon, un bloc de 4 octets pourrait avoir une partie de lui-même sur un bloc et une partie sur l'autre, nécessitant le processeur pour traiter les 2 mots pour lire ces données.
La même chose s'applique à un octet de 8 double, sauf que maintenant il doit être dans une adresse mémoire multiple de 8 à garantir qu'il sera toujours à l'intérieur d'un bloc.
Cette estime un octet de 8 traitement de texte, mais le concept s'applique à d'autres tailles de mots.
Le rembourrage des œuvres de combler les lacunes entre ces données pour s'assurer qu'ils sont alignés avec ceux des blocs, et ainsi d'améliorer les performances lors de la lecture de la mémoire.
Toutefois, comme indiqué sur d'autres réponses, parfois, l'espace est plus important que le rendement lui-même. Peut-être que vous êtes en traitement de lots de données sur un ordinateur qui ne dispose pas de beaucoup de RAM (de l'espace de swap peut être utilisé, mais il est BEAUCOUP plus lent). Vous pouvez vous arranger les variables dans le programme jusqu'à ce que le moins de rembourrage est fait (comme il a été grandement illustré dans certains autres réponses), mais si cela ne suffit pas, vous pourriez désactiver explicitement le rembourrage, qui est ce que emballage est.
(Les réponses ci-dessus expliqué la raison tout à fait clair, mais ne semble pas totalement clair à propos de la taille de rembourrage, donc, je vais ajouter une réponse en fonction de ce que j'ai appris de L'Art Perdu de la Structure C Emballage)
Mémoire aligner (pour la structure)
Règles:
e.g sur système 64 bits,
int
devrait démarrer à l'adresse divisible par 4, etlong
par 8,short
par 2.char
etchar[]
sont spéciaux, pourrait être n'importe quelle adresse mémoire, de sorte qu'ils n'ont pas besoin de rembourrage avant eux.struct
, autre que l'alignement de la nécessité pour chacun de ses membres, la taille de l'ensemble de la structure elle-même sera aligné à une taille multiple de la taille de la plus grande personne membre, par remplissage à la fin.e.g si struct plus grand membre est
long
alors divisible par 8,int
puis par 4,short
puis par 2.Afin de membre:
e.g le
stu_c
etstu_d
à partir de l'exemple ci-dessous ont les mêmes membres, mais dans un ordre différent, et le résultat dans différentes tailles pour les 2 structures.Adresse en mémoire (pour la structure)
Règles:
Struct adresse commence à partir de
(n * 16)
octets. (Vous pouvez le voir dans l'exemple ci-dessous, tous les imprimés des adresses hexadécimales de structs fin avec0
.)Raison: le possible, le plus important struct membre est de 16 octets (
long double
).Espace vide:
e.g dans
test_struct_address()
ci-dessous, la variablex
réside entre le côté structg
eth
.Peu importe si
x
est déclaré,h
s'adresse ne change pas,x
simplement de les réutiliser l'espace vide quig
gaspillée.Cas similaire pour
y
.Exemple
(pour système 64 bits)
memory_align.c:
Résultat de l'exécution -
test_struct_padding()
:Résultat de l'exécution -
test_struct_address()
:Donc l'adresse de début de chaque variable est g:d0 x:dc h:e0 y:e8
<The Lost Art of C Structure Packing>
, explique les règles assez bien, même pensé que c'est un peu plus de cette réponse. Le livre est disponible gratuitement en ligne: catb.org/esr/structure-packingAddress in memory - for struct
partie.Structure d'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 fournir
#pragma
de supprimer ou du rembourrage 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):Par exemple BRAS fournit la
__packed
mot-clé à supprimer la structure de rembourrage. Passez par votre compilateur manuel pour en savoir plus à ce sujet.Donc 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, bien sûr, parce que vous devez
traiter avec endianness)
Remplissage et d'emballage ne sont que deux aspects de la même chose:
Dans
mystruct_A
, en supposant un défaut d'alignement de 4, chaque membre est aligné sur un multiple de 4 octets. Puisque la taille dechar
est 1, le rembourrage poura
etc
est 4 - 1 = 3 octets alors qu'aucun rembourrage est nécessaire pourint b
qui est déjà de 4 octets. Il fonctionne de la même manière pourmystruct_B
.Structure de l'emballage est fait uniquement lorsque vous dites à votre compilateur explicitement pour pack la structure. Le rembourrage est ce que vous voyez. Votre système 32 bits est rembourrage de chaque champ pour le mot de l'alignement. Si vous aviez dit à votre compilateur pour emballer les structures, ils étaient 6 et 5 octets, respectivement. Ne pas le faire bien. Ce n'est pas portable et fait des compilateurs génèrent beaucoup plus lent (et parfois même buggy) du code.
Il n'y a pas de mais à ce sujet! Qui veulent saisir le sujet doit faire ce qui suit,
Structure de données de l'alignement est la façon dont les données sont organisées et accessibles dans la mémoire de l'ordinateur. Il se compose de deux questions distinctes, mais interdépendantes: l'alignement des données et la structure de données de rembourrage. Lorsqu'un moderne ordinateur lit ou écrit à une adresse de mémoire, il le fera dans word morceaux de taille (par exemple, 4 octets morceaux sur un système 32-bits) ou plus. L'alignement des données signifie mettre les données à une adresse de mémoire égale à un multiple de la taille de mot, ce qui augmente les performances du système en raison de la façon dont le CPU gère la mémoire. Pour aligner les données, il peut être nécessaire d'insérer quelques pas de sens octets entre la fin de la dernière structure de données et le début de la prochaine, qui est une structure de données de remplissage.