2012-11-10 12 views
9

Evidentlyhold_any ha prestazioni migliori di boost::any. Come riesce a fare questo?Come funziona boost :: spirit :: hold_any?

Modifica: Grazie al commento di Mat, ho trovato uno answer by hkaiser su hold_any in un'altra domanda ma manca di dettagli. Una risposta più dettagliata sarebbe gradita.

+0

Hai letto il post di Overflow dello stack collegato da quell'articolo? – Mat

+1

Hai sentito parlare di "l'idioma di ottimizzazione di piccoli oggetti" nel contesto delle classi di puntatore semantico pseudo di valore, come la stringa di std? – Yakk

risposta

1

Penso che uno dei motivi sia perché boost :: hold_any utilizza un approccio di metaprogrammazione del template mentre boost :: any usa un approccio di ereditarietà.

Internamente, boost :: :: spirito hold_any memorizza il "valore" usando un void * e usa un altro oggetto per tenere traccia delle informazioni tipo di dati:

>> 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 :: qualsiasi negozi il "valore "utilizzando un supporto e non ha bisogno di un altro oggetto per tenere traccia delle informazioni sul tipo di dati. Il titolare è ereditato dal segnaposto e di conseguenza ha gli inconvenienti dell'eredità.

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


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

... la differenza perfomance è molto più di chiamare costruttori e distruttori, ma anche per la fusione, boost :: :: spirito hold_any dovrebbe essere più veloce.

1

hold_any effettua due ottimizzazione: 1. Per gli oggetti di piccole dimensioni non assegna memoria per il proprietario dell'oggetto ma la memorizza direttamente nella memoria del puntatore; 2. Non usa il confronto di tipo RTTI (che è lento) ma usa la propria tabella di tipi

Problemi correlati