【发布时间】:2017-02-14 15:36:25
【问题描述】:
我正在寻找一个库/解决方案,以减轻我在程序中遇到的相当重要的缓存未命中次数
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,所以我的共享指针中没有循环。
【问题讨论】:
-
嗯,通过可变大小获取连续内存可能很困难。如果这很重要,我可能会考虑竞技场分配。
-
我能想到的一件事是使用自定义分配器将所有数据一起存储在内存中。这样做虽然会限制您可以拥有多少
Foo。 -
看看boost的small_vector
-
向量没有提示命令,使其大小保持在提示边界内或只是强制其父类扩展?
-
如果您不知道
Foo的最大实例数,那么您将不得不考虑当您需要增加连续存储以容纳新实例时会发生什么。任何幼稚的实现都会使所有引用、迭代器和指向Foo的所有实例的指针无效。当破坏Foo的实例时,会出现额外的复杂情况,从而在您的存储中留下漏洞(如果这很重要)。也许可以使用代理类,存储Foo实例的index,但随后您引入了一个可能无法接受的新间接级别。
标签: c++ vector cache-locality