2017-02-06 4 views
-2

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.

  1. 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?
  2. Ist es in Ordnung zu verwenden, oder es ist nur ein schlechtes Design?
  3. Wenn es eine andere Lösung gibt, können Sie es kurz erklären?
+0

"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. –

+7

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. –

+0

'static_casts' sind ziemlich schnell - einfache Zeigerarithmetik – nishantjr

Antwort

3

Der Leistungsunterschied zwischen den genannten Ansätzen ist gering. Es ist eine gute Chance, dass Sie es überhaupt nicht bemerken werden.

würde ich Ihre Klassen Form wie folgt aus:

class AnyClass 
{ 
    char type; 
    union 
    { 
     struct 
     { 
      int data1; 
     }; 
     struct 
     { 
      int data2[2]; 
     }; 
    }; 

; 

Hinweis anonyme Strukturen und Gewerkschaften mit.

Warum brauchen Sie den Zeichenpuffer überhaupt? Weisen Sie die typisierte Struktur immer zu und definieren Sie sie besser ohne Ctors und Dectors. Ich mag es nicht diese Zeile:

char type = buf[0]; // detect type 

Hier können Sie direkt den physischen nehmen versetzt. Je weniger Annahmen Sie über das Layout der Strukturen treffen, desto besser wird das Ergebnis sein.

+0

Beachten Sie, dass anonyme Strukturen in C++ nicht zulässig sind. – user2079303

+0

C++ 14 Syntax erlaubt direkt anonyme Strukturen ... Können Sie Ihre Aussage irgendwie unterstützen? –

+0

Syntax kann es erlauben, aber die Regeln nicht. Siehe [dcl.dcl]/5: http://eel.is/c++draft/dcl.dcl#5, insbesondere der letzte Satz. Oder testen Sie mit einem Compiler mit deaktivierten Erweiterungen: http://coliru.stacked-crooked.com/a/a90d2b37fa8c1a94 – user2079303