boost :: Variantenimplementierung

8

Ich bin nur neugierig auf die Implementierung von boost::variant .

Funktioniert es so?

Zwei Mitglieder:

  1. Eine Zahl, die den aktuell gespeicherten Typ darstellt (d. h. 0 für den ersten Vorlagenparameter, 1 für den zweiten Vorlagenparameter usw.)
  2. Eine Vereinigung aller möglichen Typen (die natürlich die Größe der größten hat).

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.

    
Clinton 13.11.2012, 02:28
quelle

1 Antwort

7

Es funktioniert so, wie Sie es beschrieben haben. Lange Rede, kurzer Sinn:

  1. Es hat eine Ganzzahl which , die angibt, welcher Datentyp verwendet wird.

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

    
imreal 13.11.2012, 03:15
quelle

Tags und Links