Я ищу библиотеку / решение, которое уменьшит довольно большое количество ошибок кэша, которые я испытываю в своей программе
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*>
и написать геттеры / сеттеры. Также у меня есть std::shared_ptr<Foo>
вместо Foo*
потому что я не дикарь, но это облегчает понимание примера. Наконец, я гарантирую, что владение образует DAG, поэтому у меня нет циклов в моих общих указателях.
замещать std::vector<Foo*>
с парой
std::vector<Foo*>::const_iterator begin;
std::vector<Foo*>::const_iterator end;
Сделать один std::vector<Foo*>
и поместите все указатели в него. Затем разложить непрерывные блоки указателей на отдельные экземпляры Foo
установив их begin
а также end
итераторы.
Это может потребовать предварительной обработки, когда вы строите свой график с std::vector<Foo*>
из экземпляров класса «узел», например,
class FooNode {
Foo *myFoo;
std::vector<Foo*> myVec;
};
Как только ваши узлы подключены, пройдитесь по графику и соберите myVec
в один большой вектор. Как только вы закончите со всеми отдельными векторами, снова пройдитесь по предварительному графику и установите begin
а также end
позиции в myFoo
s. Вы можете вычислить позиции, добавив размер FooNode
вектор к текущей позиции. Это будет работать, пока ваши прогулки по графику идентичны.
Других решений пока нет …