Ich bin nur neugierig auf die Implementierung von boost::variant
.
Funktioniert es so?
Zwei Mitglieder:
apply_visitor()
:
Enthält eine switch
Anweisung für die Zahl, die den aktuell gespeicherten Typ darstellt, um die richtige Überladung aufzurufen (dies würde im schlimmsten Fall als Sprungtabelle kompiliert werden, also nehmen Sie eine konstante Zeit).
Ich verstehe, dass es auch eine Reihe von Optimierungen gibt, die sicher sein können, dass boost::variant
den Speicher nicht dynamisch allozieren muss, wie detailliert hier , aber ich denke, ich bekomme diese.
Es funktioniert so, wie Sie es beschrieben haben. Lange Rede, kurzer Sinn:
Es hat eine Ganzzahl which
, die angibt, welcher Datentyp verwendet wird.
Der Speicher wird mithilfe von Boost aligned_storage
implementiert, was im Grunde ein Puffer der maximalen Datengröße ist. (Es ist in einer Union, aber für die Ausrichtung Zwecke)
Schließlich wird der Besucher tatsächlich mit einem switch
implementiert, das zur Kompilierzeit unter Verwendung von Makros erzeugt wird, um für alle Typenmöglichkeiten zu entrollen.
Tags und Links c++ boost boost-variant