2017-02-14 28 views
-1

我要寻找一个库/解决方案,将缓解高速缓存未命中的,而重要的数字,我在我的程序经历C++:矢量和缓存的区域性矢量

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,所以我没有共享指针中的循环。

+0

嗯,获取连续内存可能很难与变量大小。如果它很重要,我可能会查看竞技场分配情况。 – mascoj

+0

我能想到的一件事就是使用一个自定义分配器,将所有数据一起存储在内存中。这样做虽然限制了你可以拥有多少'Foo'。 – NathanOliver

+0

看看boost的[small_vector](http://www.boost.org/doc/libs/1_60_0/doc/html/boost/container/small_vector.html) – sp2danny

回答

2

更换std::vector<Foo*>与一对

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

使一个单一的std::vector<Foo*>,并把所有的指针进去。然后通过设置它们的beginend迭代器将指向连续的指针块指向Foo的各个实例。

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

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

一旦你的节点连接,走完图形,并收集myVec s成一个大的向量。一旦完成了所有单个向量,再次步行初步图形,并将beginend位置设置为myFoo s。您可以通过将FooNode的向量大小添加到当前位置来计算位置。只要你穿过图表是相同的,这将起作用。

+0

我真的很喜欢这个答案,但是Francois Andrieux提到如果我在容量之外添加'std :: vector '中的项目,每个迭代器都会失效 – Fezvez

+0

@Fezvez这就是对!这正是您的结构在预处理步骤结束后必须保持静态的原因。我添加了关于从'FooNode'构造图形的更多细节,它会推迟从矢量中取出迭代器,直到你确信没有进一步的修改。 – dasblinkenlight