2010-12-22 2 views
3

Pourquoi avons-nous besoin d'avoir #pragma pack pour typedef structure en C++? Plus précisément lorsque vous utilisez ces structures dans la communication réseau.#pragma pack en C++

+0

Voici toutes les informations dont vous devriez avoir besoin. Il était 1 er dans le google par requête de recherche 'pragma pack': http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx – bezmax

+0

Qu'est-ce que cela a à faire avec la programmation orientée objet? –

Répondre

0

La directive #pragma pack modifie la règle d'alignement actuelle uniquement pour les membres des structures dont les déclarations suivent la directive. Il n'affecte pas l'alignement de la structure directement, mais en affectant l'alignement des membres de la structure, il peut affecter l'alignement de la structure globale en fonction de la règle d'alignement

13

#pragma pack contrôle l'alignement des membres d'une structure . Le paramètre par défaut commun est 8, ce qui garantit que les membres d'une longueur maximale de 8 octets sont alignés sur une adresse multiple de leur taille. Un pointeur double ou 64 bits par exemple. La lecture ou l'écriture d'un double désaligné peut être assez coûteuse, généralement trois fois plus lente si elle chevauche une limite de la ligne de cache de l'UC. Cet alignement peut produire de l'espace inutilisé entre les membres, appelé remplissage.

Ce type d'alignement est souvent inappropriée pour les cadres du réseau, ils ont tendance à être emballés hermétiquement sans rembourrage, #pragma pack (push, 1)

+3

+1: Un autre point est: Si la structure n'est pas compressée et que vous voulez construire une somme de contrôle (CRC) cela devient difficile car vous devez accéder à chaque membre de la structure alors qu'avec un paquetage 1 vous pouvez simplement accéder à tous les octets de la structure. –

0

Si vous avez juste besoin de laisser 2 systèmes avec la même parler d'installation pour les uns avec les autres (test, ...), vous pouvez envoyer des structs, à condition qu'ils soient juste POD (données anciennes) (pointeurs, tables virtuelles, std :: strings ... ne peuvent pas être utilisés). Donc, le pack n'est pas nécessaire.

Si les systèmes n'ont pas la même configuration (ou ne sont pas connus), vous devez envoyer des données sérialisées dans un protocole, ce qui empêchera les structures compactées. Il est plus facile de vérifier si des protcols valides sont disponibles.

0

Les compilateurs vont «remplir» les champs et les sous-champs de la structure, c'est-à-dire les organiser en mémoire avec des blocs vides de mémoire qui ne contiennent rien au milieu. Cela permet d'augmenter l'efficacité, comme l'explique la réponse de Hans Passant.

Différents compilateurs/cibles/paramètres d'optimisation peuvent être remplis différemment, en transformant des structures logiques égales en représentations mémoire inégales, donc si deux machines communicantes passent la structure entre elles, elles peuvent ne pas se comprendre.

#pragma pack est votre façon de limiter la liberté de compilation du pad.

#pragma pack (push, 1) ordonne au compilateur de ne pas entrer de pad du tout. Si vous faites cela à deux structures identiques définies dans des codes différents, elles seront représentées de façon identique en mémoire. Ensuite, vous pouvez envoyer en toute sécurité le contenu d'une structure dans une application grâce à un protocole utilisant un pointeur et sizeof(), l'obtenir de l'autre côté et l'écrire directement sur une structure identique, en utilisant également un pointeur et sizeof().