0

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

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;中对齐(实际上是内部数组)。如何?

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

4

1 回答 1

3

std::vector<Foo*>一对

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

制作一个std::vector<Foo*>,并将所有指针放入其中。Foo然后通过设置它们的beginend迭代器,将指向单个实例的连续指针块打包出来。

std::vector<Foo*>当您使用“节点”类的实例构建图形时,这可能需要一个预处理步骤,例如

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

一旦你的节点连接起来,遍历图表,并将myVecs 收集到一个大向量中。完成所有单个向量后,再次遍历初步图形,并将begin位置设置endmyFoos。您可以通过将FooNode' 向量的大小添加到当前位置来计算位置。只要您在图表中的走动是相同的,这将起作用。

于 2017-02-14T16:00:22.450 回答