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 提供的任何“equal”函数,如果没有提供 find 函数,则使用“operator==”。

由于在这种情况下,您只是将对中的 int 值与您的预期值进行比较, unique_ptr<foo>因此不会取消引用(因此指向的数据unique_ptr<foo>不会进入缓存)。

于 2013-01-25T13:05:01.770 回答
0

严格来说你不...现在我看不出为什么这个循环应该从存储的指针中预取smth。从机器的角度来看,您已经迭代了一个充满整数和指针的连续内存块,其中只有整数被访问......没有理由预取指针内容......但是,也许稍后在你的代码中(非常接近find_if)有另一个循环会取消引用该指针,所以该死的智能编译器可以决定在第一个循环中插入一个 fetch 指令(这find_if无论如何都不会影响,所以它可以!)......我们不知道 - 它是编译器 +优化选项+架构取决于......我们甚至不知道下一个英特尔的 BlahBlahBridge 不会在没有任何编译器指令的情况下做到这一点......

于 2013-01-25T13:09:52.790 回答