Als ich Seastar-Quellcode las , bemerkte ich, dass es eine Gewerkschaftsstruktur namens gibt, tx_side
die nur ein Mitglied hat. Ist das ein Hack, um ein bestimmtes Problem zu lösen?
Zu Ihrer Information, ich füge die folgende tx_side
Struktur ein:
union tx_side {
tx_side() {}
~tx_side() {}
void init() { new (&a) aa; }
struct aa {
std::deque<work_item*> pending_fifo;
} a;
} _tx;
union
anstelle vonstruct
einer oder mehrere der Unterschiede zwischen den beiden. Es ist eine ziemlich obskure Technik. Wenn also nicht der ursprüngliche Autor dieses Codes mitkommt, bin ich mir nicht sicher, ob Ihnen jemand eine maßgebliche Antwort geben kann, welches Problem er damit lösen möchte (falls vorhanden).Antworten:
Weil
tx_side
es sich um eine Union handelt,tx_side()
die nicht automatisch initialisiert / konstruierta
und~tx_side()
nicht automatisch zerstört wird. Dies ermöglicht eine fein abgestimmte Kontrolle über die Lebensdauer vona
undpending_fifo
über platzierungsneue und manuelle Destruktoraufrufe (eines armen Mannes)std::optional
).Hier ist ein Beispiel:
Hier
B b;
druckt nichts, weila
weder konstruiert noch zerstört wird.Wenn wäre
B
einstruct
,B()
würde anrufenA()
und~B()
würde anrufen~A()
, und Sie könnten das nicht verhindern.quelle
int
Sie möglicherweise0xCCCCCCCC
. Das Lesen nicht initialisierter Daten ist undefiniertes Verhalten, und es kann vorkommen, dass der Compiler den Versuch einfach verwirft. Dies ist nicht nur Theorie. Debian hat genau diesen Fehler gemacht und die OpenSSL-Implementierung unterbrochen. Sie hatten einige echte zufällige Bytes, fügten eine nicht initialisierte Variable hinzu und der Compiler sagte: "Nun, das Ergebnis ist undefiniert, also könnte es genauso gut Null sein." Null ist offensichtlich nicht mehr zufällig.!= 0
Vergleich wahr ergab. Seitdem habe ich Compiler-Flags hinzugefügt, um nicht initialisierte Variablen als Fehler zu behandeln und sicherzustellen, dass ich nicht wieder in diese Falle tappe.Mit einfachen Worten, wenn nicht explizit ein Wert zugewiesen / initialisiert wird, initialisiert die Vereinigung einzelner Mitglieder den zugewiesenen Speicher nicht. Diese Funktionalität kann mit
std:: optional
in c ++ 17 erreicht werden.quelle