2014-10-02 15 views
9

boost :: variant scheint ein mächtiger Container zu sein, um eine heterogene Menge von Typen zu manipulieren. Ich frage mich, was es kostet. Im Speicher denke ich, dass es die Größe des größten Typs und eine Ganzzahl, die() repräsentiert, einnimmt. Für apply_visitor(), denke ich, ist seine Leistung sehr gut, es kann direkt die Funktion anders als viele Wenns aufrufen. Sind meine Punkte richtig?Was ist boost :: variant speicher und leistung kosten?

+0

Boost ist opensource. Sie könnten ein wenig recherchieren und den Quellcode durchsuchen. Es sieht so aus, als wüsstest du schon, wonach du suchen sollst. – Drop

+2

'apply_visitor' macht" viele ifs "unter der Haube (in der Tat ist es eher wie ein (großer, metaprogrammierter) Schalter auf der Art (' which() ') der Variante. Offensichtlich ist das einfach die minimal erforderliche Arbeit.) – sehe

Antwort

11

Sie haben fast Recht.

Die Größe boost::variant ist die maximale Größe eines Elements ist, gerundet für die größte Ausrichtung plus die Größe einiger ganze Zahl ist, und wieder aufgerundet wird je nach Bedarf auf.

Denken Sie an einer Variante dieser Art ist den Tag unter der Annahme uint32_t:

struct foo { uint32_t value[3]; }; // size 12, align 4 
struct bar { uint64_t v2; }; // size 8, align 8 

Eine nicht markierte Vereinigung 16 Größen haben muß, richten 8; die 4-Byte-Tag hinzufügen müssen eine Variante gehen bis zu der Größe 24 zu halten align 8.

Oder betrachten:

struct foo { uint8_t value[5]; }; // size 5, align 1 
struct bar { uint16_t v2; }; // size 2, align 2 

Eine nicht markierte Vereinigung von ihnen haben müssen Größe 6, ausrichten 2; Hinzufügen der 4-Byte-Tag zwingt Sie zu Größe 12, align 4.

Für den Aufruf, ich erwarte es eine Array-of-Funktionen Lookup (das ist, wie ich meine eigene Variante implementiert, die Boost war nicht notwendig Unterstützung von Move Constructors), da, wenn Ketten nicht gut funktionieren und Switches unmöglich sind.

Verwandte Themen