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.
Haben Sie den Stack Overflow-Beitrag gelesen, der mit diesem Artikel verknüpft ist? – Mat
Haben Sie im Zusammenhang mit semantischen Pseudo-Pointer-Klassen wie "Std-String" schon einmal von "dem kleinen Objektoptimierungs-Idiom" gehört? – Yakk