2013-01-25 26 views
1

我的問題是給下面的數據結構,std::vector<std::pair<int, std::unique_ptr<foo>>>,很簡單,如果我有以下幾點:緩存行爲:: vector的

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

我可以期待,無論是由指針指向不提取(我不希望它被提取,稍後將根據需要預取)純粹用於查找操作的緩存中?或者,這是不可能確定的(如果是這樣,我將結束這個問題..)

+0

我沒有看到你的例子中的任何指針。 .. – jcoder

+0

@ J99,這對中有一個'std :: unique_ptr '。 – Nim

+0

啊,對不起。我怎麼錯過了。 – jcoder

回答

2

當「查找」在向量中搜索時,它將查看向量中條目的值,並將其與您所在的尋找。因此,它將使用由find提供的任何「相等」函數,如果沒有提供查找函數,則使用「operator ==」。

由於在這種情況下,您只是將該對中的int值與預期值進行比較,因此unique_ptr<foo>將不會被解除引用(因此unique_ptr<foo>指向的數據將不會進入緩存)。

0

嚴格來說你不會......現在我看不到爲什麼這個循環應該從存儲的指針中預取水印。從機器的角度來看,你已經遍歷了一個連續的內存塊,其中只有ints和指針被訪問,沒有任何理由去預取指針的內容......但是,也許以後在你的代碼中(相當接近find_if)還有另一個循環可以取消引用這些指針,所以該死的智能編譯器可以決定在第一個循環中插入一個取指令(這不會影響find_if,所以它可以!)...我們不知道 - 它是編譯器+優化 - 選項+架構依賴...我們甚至不知道下一個英特爾的BlahBlahBridge不會做任何沒有任何編譯器指令...