缓存std :: vector的行为

时间:2013-01-25 12:50:09

标签: c++

我的问题很简单,给定以下数据结构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; });

我是否可以期望指针指向的任何内容都不会被提取(我不希望它被取出,以后会根据需要预先取回)进入缓存,纯粹是为了查找操作?或者这是不可能确定的(如果是这样我将关闭问题..)

2 个答案:

答案 0 :(得分:2)

当在向量中“查找”搜索时,它将查看向量中条目的值,并将其与您要搜索的内容进行匹配。因此,它将使用find提供的任何“相等”函数,或者如果没有提供要查找的函数,则使用“operator ==”。

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

答案 1 :(得分:0)

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