5

std::vectorとは対照的に、要素をメモリに継続的に保存しstd::listます。これにより、std::vectorすべてがきちんとパックされているため、要素を反復するときのパフォーマンスが向上し、std::list.

問題は、ほとんどの場合、ポリモーフィズムのため、またはこれらのオブジェクトをコードの他の部分と共有するために、スマート ポインターをベクトルに格納することです。各オブジェクトは動的に割り当てられるようになったため、最終的に異なるメモリ位置に配置されると思います。これは a を使用する目的を無効にしstd::vector、本質的に a のようなものに変えていstd::listますか? これを修正するためにできることはありますか?

4

3 に答える 3

4

std::vectoroverの最大の利点std::listは、インデックス作成が O(n) 操作ではなく O(1) 操作であることです。あなたが話しているのは、より二次的な最適化です。また、独自のオブジェクトをすべて 1 つの大きな配列にいつでも自由に格納できるので、あまり飛び回ることはありません (キャッシュの目的を考えている場合)。

于 2013-05-26T19:13:23.880 に答える
1

いいえ、それは無意味ではありません。

スマート ポインターの可能性がある複数のポインターを反復処理する場合std::list、反復子のインクリメントごとにメモリ内のほぼランダムなポイントにジャンプします。アクセスすると、メモリ内のほぼランダムなポイントに再びジャンプします。

おそらくスマート ポインターで同じ反復アクセスを行った場合std::vector、メモリ内のほぼランダムなポイントに 1 回だけジャンプします。

どうすればこの痛みを和らげることができますか?

を使用している場合は、参照カウンターとデータが同じ割り当てにあることstd::shared_ptrを忘れないでください。これにより、キャッシュ ミスが減少します。std::make_shared

ポリモーフィズムにのみ使用している場合、理論的には、代わりに a のようなものboost::variant(またはunionさまざまな型の a と型が何であるかを示すもの) を格納することができます。これにより、複数の型の変数が同じアドレス (1 つのアドレス) に存在できます。一度に、当然)。

于 2013-05-26T19:29:05.177 に答える
0

std::vectorstd::listそれを反復し、各ポリモーフィックオブジェクトでいくつかの仮想メソッドを呼び出すときと比較して、局所性の利点はまだあります。

毎回異なる関数を呼び出す可能性があるため、オブジェクトを実際のタイプでソートして、命令キャッシュ ミスを回避することをお勧めします。

于 2013-05-26T19:26:57.247 に答える