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++
Répondre
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
#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)
+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. –
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.
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().
- 1. C++ #pragma pack
- 2. Comment utiliser alignas pour remplacer pragma pack?
- 3. Utilisation de #pragma pack sur une classe
- 4. Est-ce que VB6 a un équivalent de #pragma pack?
- 5. pragma pack (1) ni __attribute__ ((aligned (1))) fonctionne
- 6. Qu'est-ce que `#pragma pack` pour la programmation réseau?
- 7. À quoi sert l'avertissement #pragma en C#?
- 8. C++ pragma GCC directive system_header
- 9. C# html agility pack
- 10. Equivalent du pack de Swing en C#
- 11. meilleure façon de se référer à la taille de la structure (#pragma pack VS taille définie)
- 12. #pragma once équivalent pour C++ builder
- 13. Utilisation de Pragma-s de SQLite en C#
- 14. optimisation de code C en utilisant GCC#pragma optimiser
- 15. Pack d'agilité C# Html (SelectSingleNode)
- 16. # directive pragma et ses utilisations dans c
- 17. C# Windows API Code Pack
- 18. YouTube HTML Agility Pack C#
- 19. utilisant pragma en parallèle pour construction
- 20. Pack uri en wpf
- 21. Convert pack python pack php
- 22. pragma omp pour l'intérieur pragma omp maître ou single
- 23. Accès aux variables internes du pack de paramètres en C++
- 24. html agility pack problème avec ul en C#
- 25. pack fichiers xml à l'intérieur dll, C#
- 26. Conditionnel "pragma omp"
- 27. Paramètre SQLite JDBC PRAGMA
- 28. Pragma anglais: héritage?
- 29. #pragma alloc_text (PAGE, nomfonction)
- 30. Android SQLcipher Problèmes PRAGMA
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
Qu'est-ce que cela a à faire avec la programmation orientée objet? –