Angenommen, wir schreiben eine C++ - Netzwerkanwendung mit UDP-Sockets. Wir brauchten eine nicht-so-kleine Packung von Daten zu übergeben, und so nehmen wir diese Art von Struktur, um sicherzustellen, die Byte-Reihenfolge ist das Netzwerk ein:Tragbare Alternative für gepackte Strukturen mit einem flexiblen Array-Element
struct [[gnu::packed]] datagram {
uint64_t timestamp;
uint8_t type;
uint32_t temperatures[60]; // whatever, just an example
uint8_t raw_data[];
};
Wir GNU GCC verwendet hat, so dass wir nutzten nicht-Standard-C++ Funktionen wie
- flexiblen Feldelements
- gepackten Struktur
wir brauchten eine gepackte Struktur, da wir zwischendurch nicht padding wollen, da dieser Architekt sein kann ure-abhängig, und unser Netzwerkprogramm kann auf verschiedenen Architekturen laufen.
Dann, nach einem Jahr, kann es herauskommen, dass wir einen Nicht-GCC-Compiler unterstützen müssen, der diese nicht unterstützt.
Ist es möglich, dies in Standard C++ zu tun?
Natürlich weiß ich, wir könnten einfach einen uint8_t buffer[SOME_SIZE]
verwenden und memcpy jeden Teil des Datagramms, aber das klingt wie eine gute Möglichkeit, schrecklichen, wirklich hässlichen Code zu erstellen.
Suchen und verwenden Sie eine Serialisierungsbibliothek. Dieses Problem wurde viele Male gelöst, aber die Leute bestehen darauf, es immer und immer wieder zu tun, weil keine der Lösungen gut ist. – nwp