Я работаю с менеджером памяти, который иногда хочет дефрагментировать память. По сути, я рассмотрю список объектов, выделенных диспетчером памяти, и переместу их:
class A {
SomeClass* data; // This member is allocated by the special manager
};
for(... each instance of A ...)
a.data = memory_manager.relocate(a.data);
memory_manager.relocate()
доставит memcpy()
содержимое данных в новое место и вернет указатель.
Хотя это, как правило, идиоматично для memcpy()
классов C ++, в этом случае представляется полезным решением, учитывая, что я контролирую реализацию (нескольких) классов, которые будут использоваться с менеджером памяти.
Проблема в том, что один из этих классов использует std::map
, насколько я понимаю, непрозрачный класс. Я, конечно, не представляю, что смогу memcpy()
. Я не могу использовать std :: map в любом случае. Насколько я знаю, он мог бы выделить несколько частей памяти.
Лучший обходной путь, который я могу придумать, достаточно прост. В связи с тем, что менеджер фрагментированной памяти будет размещать новые выделения в более выгодных местах, все, что мне нужно сделать, это выделить его заново, а затем удалить старое:
for(... each instance of A ...) {
stl::map<something>* tmp = a.the_map;
a.the_map = new stl::map<something>(tmp);
delete tmp;
}
В любом случае это заставляет меня задуматься:
Есть ли в C ++ семантика или идиомы для перемещения / копирования объекта в определенную область памяти?
Можно ли переместить содержимое контейнера stl в определенную область памяти?
Изменить: Хотя я не указал на это, я бы, очевидно, передал параметр распределителя в std :: map. Основываясь на информативных ответах, которые я получил, я понимаю, что обходной путь, который я разместил в своем первоначальном вопросе, вероятно, будет единственным способом уменьшить фрагментацию. Используя конструктор копирования карты (и параметр шаблона распределителя), вся память, используемая картой, будет правильно перераспределена.
Как отмечается в комментарии, это в основном теоретическая проблема. Фрагментация памяти редко вызывает беспокойство.