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*> и написать геттеры / сеттеры. Также у меня есть std::shared_ptr<Foo> вместо Foo* потому что я не дикарь, но это облегчает понимание примера. Наконец, я гарантирую, что владение образует DAG, поэтому у меня нет циклов в моих общих указателях.

0

Решение

замещать 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 позиции в myFoos. Вы можете вычислить позиции, добавив размер FooNodeвектор к текущей позиции. Это будет работать, пока ваши прогулки по графику идентичны.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]