Supposons que nous écrivions une application réseau C++ à l'aide de sockets UDP. Nous avions besoin de passer un pas si petit paquet de données, nous avons donc utilisé ce type de structure, en veillant à l'ordre des octets est le réseau un:Alternative portable pour les structures compactes avec un membre de groupe flexible
struct [[gnu::packed]] datagram {
uint64_t timestamp;
uint8_t type;
uint32_t temperatures[60]; // whatever, just an example
uint8_t raw_data[];
};
Nous utilisions GNU GCC, donc nous avons profité de non standard caractéristiques ++ C tels que membre
- flexible de tableau
- Structure emballée
nous avions besoin d'une structure emballée puisque nous ne voulons pas de rembourrage entre les deux, car cela pourrait être architecte uré-dépendante, et notre programme de réseau peut fonctionner sur différentes architectures.
Ensuite, après un an, il se peut que nous devions prendre en charge un compilateur non-GCC, qui ne les prend pas en charge. Est-il possible de faire cela en C++ standard?
Bien sûr, je sais que nous pourrions simplement utiliser un uint8_t buffer[SOME_SIZE]
et memcpy chaque partie du datagramme, mais cela semble être un excellent moyen de créer du code horrible, vraiment moche.
Recherchez et utilisez une bibliothèque de sérialisation. Ce problème a été résolu à plusieurs reprises, pourtant les gens insistent pour le faire encore et encore parce qu'aucune des solutions n'est bonne. – nwp