5

Boostのany_rangeドキュメントには、次のように書かれています。

基盤となるのは利用可能な最速の実装ですが、インクリメント、デクリメント、アドバンス、イコールなどを実装するために必要な仮想関数呼び出しのコストのためany_iterator、のパフォーマンスオーバーヘッドは依然としてかなりのものです。多くの場合、より適切な設計選択は標準形に変換することです。any_range

著者は「標準形」とはどういう意味ですか?誰かが例をあげることができますか?

編集: ここで提案されているように、私はブーストユーザーのメーリングリストで同じ質問をしました。このテキストの原作者であるNeilGrovesは、次のように述べています。

たとえば、範囲をベクトルにコピーします。

はい、これはまさに私がドキュメントを書くときに考えていた代替設計です。any_rangeを反復処理するオーバーヘッドはかなり大きく、具体的な結果タイプをベクトルなどのコンテナーにコピーする場合と比較すると、多くの場合不十分です。ただし、これは常に当てはまるわけではなく、Boost.Rangeの一部のユーザーは、any_rangeインスタンスで動作するアルゴリズムを実装する機能を望んでいます。これは、たとえば、さまざまなコンテナをサポートする共有ライブラリからのアルゴリズムの公開を可能にするために望ましい場合があります。any_rangeを使用することは、範囲を超えるパスの数が少ない場合にも意味がありますが、基になるコンテナのメモリサイズは非常に大きくなります。

多くの場合、パフォーマンスのオーバーヘッドは重要ではありません。私は、any_rangeの使用法が広く採用されるように誰かを誤解させないようにしたかったのです。このクラスの有効な使用法は少ないと思いますが、正確に正しい設計上の選択である場合もあります。やがて、いくつかの追加の説明と例を使用してドキュメントを改善します。

4

2 に答える 2

3

std::vector範囲を、またはプロジェクト内の標準コンテナに変換し、それにイテレータを返すことを意味していると思います。

トレードオフは、元の範囲型から標準コンテナー型への範囲のコピーを作成するコストと、any_range を実装するために使用される型消去に関連するヒープ割り当てと仮想関数呼び出しのコストとの間です。範囲内の要素の数、各要素の大きさ、および範囲内で行われるパスの数に応じて、1 つのオプションが他のオプションよりも優れている場合があります。

于 2011-04-09T19:30:55.080 に答える
3

の目的はany_range、基礎となる反復子の詳細を変更した場合にコードのユーザーが再コンパイルする必要がないように、具体的な反復子型をラップすることです。イテレータのPimplと考えてください。

ドキュメントは、基礎となる具象イテレータ型を直接公開する方が (実行時に)常により効率的であると述べているだけです。

于 2011-04-08T23:08:38.880 に答える