1

次のデータ構造を考えると、私の質問は十分に単純std::vector<std::pair<int, std::unique_ptr<foo>>>です。

auto it = std::find_if(begin(v), end(v), [&](std::pair<...> const& p){ return p.first == some_value; });

ポインターが指しているものが何であれ、純粋に検索操作のためにキャッシュにフェッチされないことを期待できますか (フェッチしたくないので、必要に応じて後でプリフェッチします)。それとも、これを判断することは不可能ですか(そうであれば、質問を閉じます..)

4

2 に答える 2

2

「find」がベクター内を検索する場合、ベクター内のエントリの値を調べて、それを検索対象と一致させます。そのため、find によって提供される「equal」関数を使用するか、find に関数が提供されていない場合は「operator==」を使用します。

この場合、ペアの int 値を期待値と比較しているだけなので、 は unique_ptr<foo>逆参照されません (したがって、 が指すデータunique_ptr<foo>はキャッシュに入りません)。

于 2013-01-25T13:05:01.770 に答える
0

厳密に言えば、そうではありません...最近、このループが保存されたポインターからsmthをプリフェッチする必要がある理由がわかりません。マシンの観点からは、int とポインターでいっぱいの連続したメモリ ブロックを反復処理しました。ここでは、int のみがアクセスされます...ポインターのコンテンツをプリフェッチする理由はありません...しかし、コードの後半 (かなり近いfind_if) があるかもしれませんそのポインターを逆参照する別のループなので、気の利いたコンパイラーは最初のループにフェッチ命令を挿入することを決定できます(これはfind_ifとにかく影響しないので、可能性があります!)...わかりません-それはコンパイラーです+最適化オプション + アーキテクチャに依存... 次の Intel の BlahBlahBridge がコンパイラの指示なしでそれを実行しないことさえわかりません...

于 2013-01-25T13:09:52.790 に答える