3

私はいくつかのファンクターに渡す必要があるオブジェクトのコレクション (現在boost::ptr_vector) を持っています (これを vec と呼びましょう)。すべてのファンクターに、基本的にキャッシュである同じ vec への参照/ポインターを持たせて、各ファンクターが同じデータ キャッシュを持つようにします。これを行うには、次の 3 つの方法が考えられます。

  1. Functor クラスboost::ptr_vector<object>&のコンストラクターにa を渡し、メンバーFunctorを持つboost::ptr_vector<object>&

  2. boost::ptr_vector<object>*Functor のコンストラクターにa を渡し、boost::ptr_vector<object>*Functor クラスにメンバーを持つ

  3. の使用を避け、配列 ( ) をコンストラクターにboost::ptr_vector直接渡すobject*

方法 3 を使用しようとしましたが、生のポインターの代わりにベクターを使用する必要があると常に言われました。そのため、方法 2 を試しましたが、ポインターによって追加された余分なレベルの間接性が原因で、プログラムにレイテンシが追加されました。現時点では方法 1 を使用していますが、ファンクターの有効期間中にキャッシュを再割り当てする必要がある場合があるため (データ キャッシュが変更される可能性があるため)、これは適切な代替手段ではない可能性があります。

私は完全には理解していません。ファンクターがコピーされている途中のどこかを想定しています (ただし、これらはすべて ptr_vector 自体に格納されています)。

方法 3 は私の場合に最適ですか? 方法 2 は遅すぎます (レイテンシーが非常に重要です)。方法 1 に関しては、代わりにベクトルを使用するように何度もアドバイスされています。

どんなアドバイスでも大歓迎です

4

1 に答える 1

2

C++ の参照は、変数にのみ初期化 (「バインド」) できます。

その時点以降、参照はその存続期間中に「再配置」(別の変数を参照するように作成) することはできません。

これが、デフォルトのコピーコンストラクターが生成される可能性がある理由ですが、代入演算子は生成されません。参照を「変更」する必要があるためです。

ここで私が推奨するアプローチは、参照の代わりにスマート ポインターを使用することです。

  • std::unique_ptr (最も単純で、割り当て/割り当て解除を処理します)
  • std::shared_ptr (より複雑で、所有権の共有が可能)

この場合:

std::shared_ptr<boost::ptr_vector<object> > m_coll;

ぴったりだと思われる

于 2012-11-14T16:08:11.583 に答える