Boost.Variant - recursive Boost.Variant - recursive (2)のまとめ。

Boost.Variantで再帰したい場合の基本的な書き方は、

typedef boost::make_recursive_variant_over<
  boost::mpl::list<
    boost::blank,
    std::string,
    std::list<boost::recursive_variant_>
  >
>::type old_variant;

make_recursive_variant_overメタ関数を差し替えて使う(非over版は面倒なので作ってない)。

typedef morla::variant::make_recursive_variant_over<
  boost::mpl::list<
    boost::blank,
    std::string,
    std::list<boost::recursive_variant_>
  >
>::type new_variant;

書き方はオリジナルといっしょ。

次に評価。評価した環境はx86_64のdarwinで
  • sizeof(void*) == 8
  • sizeof(std::string) == 8
  • sizeof(std::list<T>) == 16

結果、上で書いたold_variantもnew_variantもストレージサイズは8になる。std::list<T>が入りきらないのでboost::recursive_wrapper<std::list<T> >(すなわちstd::list<T>*)にフォールバックされちゃう。このままだとsmall objectに対応した意味がまったくない。というわけで、強制的にストレージサイズを16にした場合の時間も計測。
storage sizeoriginal (sec)small object (sec)
84.12N/A
164.413.85

このケースでは、かろうじて速くなった。だけど、一般的に考えると、再帰する型をスタックに積みたいからといって、いたずらにストレージサイズを増やすのはたぶん悪手だと思う。

このページへのコメント

DwOigH <a href="http://ihexqqqscydz.com/">ihexqqqscydz</a>, [url=http://gxmrinrcdazc.com/]gxmrinrcdazc[/url], [link=http://lxpfkqzluudv.com/]lxpfkqzluudv[/link], http://wlxbnghnbzkt.com/

0
Posted by dvuher 2013年11月14日(木) 09:11:26 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます