2

boost::variant でのディスパッチはどのくらい効率的ですか?

switch ステートメントの場合、O(1) 時間しかかからないはずですが、私の知る限り、テンプレート メタプログラムは if しか生成できません。これにより、boost::variant ディスパッチが O(n) のランタイム オーバーヘッドで発生します。ここで、n = バリアントのタイプの数。

誰かがこれについて私を確認/否定/啓発できますか?

ありがとう!

4

2 に答える 2

4

ソースを見ると一定時間のはず。Boost は Boost.PreProcessor を使用してスイッチ テーブルを生成し、ジャンプ先のインデックスを追跡します (格納されている型を介して)。

于 2010-01-28T21:21:14.890 に答える
0

しかし、私の知る限り、テンプレート メタプログラムは if のみを生成できます。これにより、boost::variant ディスパッチが O(n) のランタイム オーバーヘッドで発生します。

いいえ: テンプレート メタプログラミングはコンパイル時ifに評価されるため、オーバーヘッドがテンプレート メタプログラミングによって定義されている場合、それはコンパイル時のオーバーヘッドになります。実行時のオーバーヘッドは一定になります。

boost::variant警告:発送の仕組みがわかりません。ただし、 compile-time を使用して実装されている場合ifは、上記のように動作します。

于 2010-01-28T21:10:05.687 に答える