9

よりも明らか hold_anyに優れたパフォーマンスを発揮しboost::anyます。どうやってこれを行うのですか?

編集: マットのコメントのおかげで、別の質問で hkaiser による回答が見つかりましたが、詳細が不足していますhold_anyより詳細な回答を歓迎します。

4

2 に答える 2

1

その理由の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の方が高速である必要があります。

于 2012-11-10T12:20:44.073 に答える