Question

Dans le guide de mise en réseau beej il y a une section de données de triage ou d'emballage pour la sérialisation où il décrit diverses fonctions pour les données d'emballage et le déballage (int, float, double ..etc).

Il est plus facile d'utiliser l'union (similaire peut être défini pour float et double) tel que défini ci-dessous et transmettre integer.pack comme version compactée integer.i, plutôt que Emballer et déballer les fonctions.

union _integer{
  char pack[4];
  int i;
}integer;
  1. Quelqu'un peut faire la lumière sur la raison pour laquelle l'union est un mauvais choix?

  2. Y at-il une meilleure méthode de données d'emballage?

Était-ce utile?

La solution

Les différents ordinateurs peuvent mettre les données différemment. La question classique est endianess (dans votre exemple, si le pack [0] a le MSB ou LSB). L'utilisation d'un syndicat comme celui-ci lie les données à la représentation spécifique sur l'ordinateur qui l'a généré.

Si vous voulez voir d'autres façons de données marshall, consultez la page sérialisation Boost et Google protobuf .

Autres conseils

L'astuce du syndicat n'est pas garanti au travail, même si elle le fait habituellement. Il est parfaitement valide (selon la norme) pour vous de définir les données char, puis lisez 0s lorsque vous essayez de lire l'int, ou vice-versa. l'union a été conçu pour être une mémoire micro-optimisation, pas un remplacement pour la coulée.

À ce stade, en général, vous enveloppez la conversion dans un objet à portée de main ou de l'utilisation reinterpret_cast. Légèrement encombrant, ou laid ... mais aucun des deux ne sont pas nécessairement mauvaises choses quand vous emballez des données.

Pourquoi ne pas faire juste un reinterpret_cast à un char* ou un memcpy dans un tampon de char? Ils sont essentiellement la même chose et moins de confusion.

Votre idée fonctionnerait, alors allez-y si vous voulez, mais je trouve que le code propre est un code heureux. Plus il est facile de comprendre mon travail, moins il est probable que quelqu'un (comme mon futur moi) va le briser.

Notez également que seuls les types POD (données pures et simples) peuvent être placés dans une union, qui met des limites à l'approche syndicale qui ne sont pas là, dans une plus intuitive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top