Boost.Variant - recursive Boost.Variant - recursive (2)のまとめ。
Boost.Variantで再帰したい場合の基本的な書き方は、
make_recursive_variant_overメタ関数を差し替えて使う(非over版は面倒なので作ってない)。
書き方はオリジナルといっしょ。
次に評価。評価した環境はx86_64のdarwinで
結果、上で書いたold_variantもnew_variantもストレージサイズは8になる。std::list<T>が入りきらないのでboost::recursive_wrapper<std::list<T> >(すなわちstd::list<T>*)にフォールバックされちゃう。このままだとsmall objectに対応した意味がまったくない。というわけで、強制的にストレージサイズを16にした場合の時間も計測。
このケースでは、かろうじて速くなった。だけど、一般的に考えると、再帰する型をスタックに積みたいからといって、いたずらにストレージサイズを増やすのはたぶん悪手だと思う。
- ヘッダ: http://ideone.com/kHXvZ
- サンプル: http://ideone.com/cw59P
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 size | original (sec) | small object (sec) |
8 | 4.12 | N/A |
16 | 4.41 | 3.85 |
このケースでは、かろうじて速くなった。だけど、一般的に考えると、再帰する型をスタックに積みたいからといって、いたずらにストレージサイズを増やすのはたぶん悪手だと思う。
このページへのコメント
DwOigH <a href="http://ihexqqqscydz.com/">ihexqqqscydz</a>, [url=http://gxmrinrcdazc.com/]gxmrinrcdazc[/url], [link=http://lxpfkqzluudv.com/]lxpfkqzluudv[/link], http://wlxbnghnbzkt.com/