2012-11-10 12 views
9

Evidentlyhold_any hat eine bessere Leistung als boost::any. Wie schafft es das?Wie funktioniert boost :: spirit :: hold_any?

Edit: Dank Mat Kommentar, fand ich eine answer by hkaiser über hold_any bei einer anderen Frage, aber es fehlen Details. Eine ausführlichere Antwort wäre willkommen.

+0

Haben Sie den Stack Overflow-Beitrag gelesen, der mit diesem Artikel verknüpft ist? – Mat

+1

Haben Sie im Zusammenhang mit semantischen Pseudo-Pointer-Klassen wie "Std-String" schon einmal von "dem kleinen Objektoptimierungs-Idiom" gehört? – Yakk

Antwort

1

Ich denke, einer der Gründe ist, weil boost :: hold_any einen Template-Metaprogrammierungsansatz verwendet, während boost :: any einen Vererbungsansatz verwendet.

Intern boost :: spirit :: hold_any speichert den "Wert" mit einem void * und verwendet ein anderes Objekt Spur der Datentyp Info zu halten:

>> boost/spirit/home/support/detail/hold_any.hpp 
template <typename Char> 
class basic_hold_any 
{ 
    .... 
    spirit::detail::fxn_ptr_table<Char>* table; 
    void* object; 
    ... 
} 

boost :: any speichert den „Wert "mit einem Halter, und es braucht kein anderes Objekt, um die Datentypinfo zu verfolgen. Der Inhaber wird vom Platzhalter geerbt und hat folglich die Nachteile der Vererbung.

>> boost/any.hpp 
class any 
{ 
    ... 
    placeholder * content; 
    ... 
} 


class placeholder 
template<typename ValueType> 
class holder : public placeholder 
{ 
    ... 
    ValueType held; 
    ... 
} 

... die perfomance Unterschied ist viel mehr über Konstruktoren und Destruktoren aufrufen, sondern auch für das Gießen, boost :: spirit :: hold_any sollte schneller sein.

1

hold_any führt zwei Optimierungen durch: 1. Für kleine Objekte reserviert es keinen Speicher für den Objekthalter, sondern speichert es direkt im Zeigerspeicher; 2. RTTI-Vergleich wird nicht verwendet (was langsam ist), aber verwenden Sie eine eigene Typentabelle

Verwandte Themen