Angenommen ich einige Strukturen habe, die im Grunde ein ‚allgemeines‘ Feld haben, und einige einzigartigen Daten, wie:Union vs Vererbung in Strukturen
struct A
{
char type;
int data;
};
struct B
{
char type;
int data[2];
};
und usw. (Ich habe eine Menge von ihnen). Also kann ich einfach eine Basisstruktur mit gleichen Feldern erstellen und andere erben. Ich, dass wenn ich das gleiche tun union
, zB:
union AnyClass
{
struct A _a;
struct B _b;
...
};
ich einige Daten erhalte (was genau passt das größte Mitglied in union
), so würde es vorziehen, folgende Syntax zu verwenden:
// to read it from buffer (I am receiving data from another PC, which stores data the same way (in the same union) as I do
char buf[sizeof(AnyClass)];
char type = buf[0]; // detect type
AnyClass inst;
memcpy(&inst, buf, sizeof(inst));
switch(type)
{
... // handle data according to its type
}
// if I want to create a new object, and send it, I can use
AnyClass myObj;
new (&myObj._b) B();
... // do whatever I want
HINWEIS: Ich bin mir bewusst, dass ich Daten irgendwie ausrichten muss, so dass beide Maschinen (empfangen/Absender) korrekt interpretieren sollten.
- Kann es schneller als gleiches Problem Lösung läuft mit
BaseStructure
und vererbte andere (so, ich habe sie sofort werfen), oder es wird auf fast den gleichen Code kompiliert werden? - Ist es in Ordnung zu verwenden, oder es ist nur ein schlechtes Design?
- Wenn es eine andere Lösung gibt, können Sie es kurz erklären?
"oder ist es nur ein schlechtes Design?" - Sieht für mich so aus - aber Sie haben das eigentliche Problem, das Sie lösen wollen, nicht beschrieben. –
Sie sollten so etwas wie _google protocol buffers_ betrachten, wenn Daten unabhängig von der Zielarchitektur (Little/Big Endian) über ein Netzwerk ausgetauscht werden sollen. Das Zerlegen von Nachrichten mit manuell erstellten Unionen ist wahrscheinlich eine schlechte Idee. –
'static_casts' sind ziemlich schnell - einfache Zeigerarithmetik – nishantjr