我正在寻找一个库/解决方案,可以减轻我在程序中遇到的相当重要的缓存缺失次数
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 :(得分:3)
用一对
替换std::vector<Foo*>
std::vector<Foo*>::const_iterator begin;
std::vector<Foo*>::const_iterator end;
制作一个std::vector<Foo*>
,并将所有指针放入其中。然后通过设置Foo
和begin
迭代器,将end
的各个实例的连续指针块包裹起来。
这可能需要预处理步骤,当您使用std::vector<Foo*>
从&#34;节点&#34;的实例构建图表时类,例如
class FooNode {
Foo *myFoo;
std::vector<Foo*> myVec;
};
连接节点后,浏览图表,将myVec
收集到一个大向量中。完成所有单个向量后,再次遍历初步图表,并将begin
和end
位置设置为myFoo
s。您可以通过将FooNode
向量的大小添加到当前位置来计算位置。只要您浏览图表完全相同,这将有效。