よりも明らか hold_any
に優れたパフォーマンスを発揮しboost::any
ます。どうやってこれを行うのですか?
編集: マットのコメントのおかげで、別の質問で hkaiser による回答が見つかりましたが、詳細が不足しています。hold_any
より詳細な回答を歓迎します。
その理由の1つは、boost :: hold_anyがテンプレートメタプログラミングアプローチを使用しているのに対し、boost::anyは継承アプローチを使用しているためだと思います。
内部的には、boost :: spirit :: hold_anyは、void *を使用して「値」を格納し、別のオブジェクトを使用してデータ型情報を追跡します。
>> 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はホルダーを使用して「値」を格納し、データ型情報を追跡するために別のオブジェクトを必要としません。ホルダーはプレースホルダーから継承されるため、継承の欠点があります。
>> boost/any.hpp
class any
{
...
placeholder * content;
...
}
class placeholder
template<typename ValueType>
class holder : public placeholder
{
...
ValueType held;
...
}
...パフォーマンスの違いは、コンストラクタとデストラクタの呼び出しに関するものですが、キャストの場合でも、boost :: spirit::hold_anyの方が高速である必要があります。