C ++:向量和缓存局部性的向量

时间:2017-02-14 15:36:26

标签: c++ vector cache-locality

我正在寻找一个库/解决方案,可以减轻我在程序中遇到的相当重要的缓存缺失次数

class Foo{
    std::vector<Foo*> myVec;

    // Rest of the class
};

int main(){
     // Some code
     std::vector<Foo*> myVecOfFoo;
}

所以,我做的第一件事就是创建一个std::vector<Foo>,每个Foo*指向此向量。它帮助了很多。 我的主要问题是std::vector<Foo*> myVec; 。这些向量的内部数组中的每一个都位于存储器的不同部分中。就像我创建单个std::vector<Foo>以便我的所有Foo在内存中连续一样,我希望我的所有std::vector<Foo*> myVec;在内存中对齐(实际上,内部数组) 。怎么样?

注意:重要的一点是,myVec的大小在Foo的实例之间有所不同。否则,我可以简单地构建一个std::vector<Foo*>并编写getter / setter。另外,我有std::shared_ptr<Foo>而不是Foo*因为我不是野蛮人,但它使得对示例的理解更容易。最后,我保证所有权形成一个DAG,所以我的共享指针中没有循环。

1 个答案:

答案 0 :(得分:3)

用一对

替换std::vector<Foo*>
std::vector<Foo*>::const_iterator begin;
std::vector<Foo*>::const_iterator end;

制作一个std::vector<Foo*>,并将所有指针放入其中。然后通过设置Foobegin迭代器,将end的各个实例的连续指针块包裹起来。

这可能需要预处理步骤,当您使用std::vector<Foo*>从&#34;节点&#34;的实例构建图表时类,例如

class FooNode {
    Foo *myFoo;
    std::vector<Foo*> myVec;
};

连接节点后,浏览图表,将myVec收集到一个大向量中。完成所有单个向量后,再次遍历初步图表,并将beginend位置设置为myFoo s。您可以通过将FooNode向量的大小添加到当前位置来计算位置。只要您浏览图表完全相同,这将有效。

相关问题