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.
fonte
2012-11-10 12:20:44
Hai letto il post di Overflow dello stack collegato da quell'articolo? – Mat
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