2012-11-13 10 views
8

私はboost::variantの実装について興味があります。boost :: variant implementation

このように機能しますか?

2人のメンバー:

  1. (第2のテンプレートパラメータなどのために、すなわち0最初のテンプレートパラメータは、1)現在記憶されているタイプを表す数字
  2. コースの全ての可能な種類(の組合最大のサイズ)。

apply_visitor()

(これはジャンプテーブルとしてコンパイルすることが最悪の場合にはその一定の時間がかかるでしょう)正しいオーバーロードを呼び出すために現在保存されているタイプを表す数でswitch文を持っています。

また、boost::variantには、詳細なhereのように動的にメモリを割り当てる必要はないことが確かな数多くの最適化がありますが、私はこれらを得ると思います。

+0

実際にはソースコードを見ることができ、ドキュメンテーションでさえそれがどのように実装されているかを知ることができます。私はバッファ(十分な型のchar配列)とバッファを解釈する方法を決定するタグを期待します。 –

+1

事前に申し訳ありませんが、ソースを見てきましたか?ソースを勉強したり、テストアプリケーションをビルドしたり、デバッガでステップ実行したりすることで、動作の仕組みを正確に把握できるはずです。 – Bukes

答えて

7

これはあなたの説明どおりです。かいつまん:

  1. これは、データ型が使用されているかを示す整数whichを持っています。

  2. 記憶は、基本的に最大データサイズのバッファであるブーストのaligned_storageを使用して実装されます。 (それが組合であるが、位置合わせのために)

最後に、訪問者は、実際にすべてのタイプの可能性をアンロールするマクロを使用してコンパイル時に生成され、switchで実装されています。

関連する問題