Так что мой код использует tr1::unordered_map<int, ContainerA>
где ContainerA выглядит примерно так:
class ContainerA
{
int* _M_type;
unsigned int _M_check;
int _M_test;
unsigned int _M_any;
index _M_index;
index _M_newindex;
objectB _M_cells[10];
vector<int> _M_mapping[10];
}
Количество записей в моем unordered_map составляет порядка миллионов, и на каждом временном шаге десятки тысяч (если не сотен тысяч) записей удаляются и добавляются. Кажется, что большая часть моего вычислительного времени расходуется на индивидуальное выделение каждого экземпляра класса ContainerA.
Решение, которое я предлагаю для ускорения, состоит в том, чтобы динамически распределять предполагаемое количество объектов ContainerA, необходимых в начале, и заменять unordered_map для объектов ContainerA на unordered_map для указателей. tr1::unordered_map<int, ContainerA*>
,
Это кажется хорошей идеей для меня, однако после некоторого исследования мне не кажется, что этот подход является распространенным, поэтому я задаюсь вопросом, если я что-то упустил.
Есть ли какие-либо недостатки этого подхода, кроме дополнительных накладных расходов указателей на память?
Редактировать :
Как указано в комментариях ниже, проблема может быть связана с моим распределением памяти. Я выделяю свою память следующим образом:
Я строю ContainerA
объект, используя его конструктор ContainerA obja(int* type, int test)
, На этом этапе ContainerA
Конструктор позволяет objectB
массив и vector<int>
массив по умолчанию построен.
После построения моего ContainerA
, все мое vector<int>
а также objectB
нужно выделить немного памяти в куче. Это, вероятно, длительный этап.
Вероятно, было бы возможно избежать освобождения и перераспределения памяти без использования unordered_map
к указателям, но просто меняя содержимое памяти, как это было предложено. Однако мне нужно было бы иметь какой-то способ отслеживания того, какие объекты больше не используются, и это звучит как-то более утомительно, чем переключение на массив указателей?
Задача ещё не решена.
Других решений пока нет …