I am looking for a library/solution that will alleviate the rather important number of cache miss I am experiencing in my program
class Foo{
std::vector<Foo*> myVec;
// Rest of the class
};
int main(){
// Some code
std::vector<Foo*> myVecOfFoo;
}
So, the first thing I did was to create a std::vector<Foo> and every single Foo* points toward this vector. It helped a lot. My main issue is with std::vector<Foo*> myVec;. Each one of these vectors' internal array is located in a different part of the memory. In the same way that I created a single std::vector<Foo> so that all my Foo are contiguous in memory, I would like all my std::vector<Foo*> myVec; to be aligned in memory (Actually, the internal arrays). How?
Notes : An important point is that the size of myVec varies between instances of Foo. Otherwise I could trivially build a single std::vector<Foo*> and write getters/setters. Also, I have std::shared_ptr<Foo> instead of Foo* because I am not a savage, but it makes the understanding of the example easier. Finally, I guarantee that the ownership forms a DAG, so I don't have cycles in my shared pointers.
Foo's you can have.Foothen you will have to consider what happens when you need to grow your contiguous storage to accommodate new instances. Any naive implementation will invalid all references, iterators and pointers to all instances ofFoo. An additional complication occurs when destroying instances ofFooout of order, leaving holes your in your storage (if this matters). Perhaps a proxy class can be used, storing the index of theFooinstance, but then you introduce a new level of indirection that might not be acceptable.