boost::variant でのディスパッチはどのくらい効率的ですか?
switch ステートメントの場合、O(1) 時間しかかからないはずですが、私の知る限り、テンプレート メタプログラムは if しか生成できません。これにより、boost::variant ディスパッチが O(n) のランタイム オーバーヘッドで発生します。ここで、n = バリアントのタイプの数。
誰かがこれについて私を確認/否定/啓発できますか?
ありがとう!
ソースを見ると一定時間のはず。Boost は Boost.PreProcessor を使用してスイッチ テーブルを生成し、ジャンプ先のインデックスを追跡します (格納されている型を介して)。
しかし、私の知る限り、テンプレート メタプログラムは if のみを生成できます。これにより、boost::variant ディスパッチが O(n) のランタイム オーバーヘッドで発生します。
いいえ: テンプレート メタプログラミングはコンパイル時if
に評価されるため、オーバーヘッドがテンプレート メタプログラミングによって定義されている場合、それはコンパイル時のオーバーヘッドになります。実行時のオーバーヘッドは一定になります。
boost::variant
警告:発送の仕組みがわかりません。ただし、 compile-time を使用して実装されている場合if
は、上記のように動作します。