Если у меня есть контейнер:
std::vector<T*> elements;
могу ли я использовать размещение new для размещения моих объектов так, чтобы все объекты располагались смежно? Так что я могу сделать что-то вроде этого:
size_t elementIndex = someRandomElement - elements[0];
Где someRandomeElement
- это случайный элемент из elements
, а elementIndex
будет хранить правильный индекс someRandomElement
, так что elements[elementIndex] == someRandomElement
Это необходимо для моей текущей реализации менеджера памяти. У меня есть реализация, которую я смог завершить сегодня, но она требует, чтобы элементы (которые могут быть вокселем, треугольником или чем-то еще) имели функцию GetIndex () и SetIndex (), чтобы при возврате элемента в качестве указателя Я могу узнать индекс элемента в массиве elements
, что означает, что любые элементы, которые я не могу изменить (скажем, Ogre :: Vector3), не могут использовать менеджер (в моем случае они нужны мне, потому что он они фрагментируют память).
Мое единственное другое решение - иметь структуру, которая действует как средство доступа и имеет индекс, а также указатель на элемент, хотя это приведет к увеличению использования памяти (учитывая, что я сейчас работаю с 5 миллионами элементов) .
ПРИМЕЧАНИЕ: есть аналогичный вопрос , который я отправил сегодня, но ответы там делают некоторые предположения, которые полностью соответствуют моим требованиям. Одним из требований является то, что вектор должен быть заполнен указателями на T
, в противном случае большая часть кодовой базы должна измениться. Во-вторых, инициализация более 100 000 (приблизительно) элементов приводит к исключению bad_alloc. Каждый элемент имеет размер 196 байт (мне удалось уменьшить его до 132 байт).