У меня есть пул памяти, который имеет заданный размер и разделен на сегменты заданного размера. Когда я удаляю некоторые данные, он помечает сегменты, которые данные использовали, как свободные. В следующий раз, когда я попытаюсь выделить память, но у меня нет места, я перераспределяю память, сдвигая все данные вниз (например, первые 2 сегмента очищаются, перемещая все данные вниз на 2 блока). Все это работает нормально, но моя проблема в том, что мои указатели на эти данные не меняются, и я не уверен, как я могу это сделать.
Я выделяю память из своего пула, возвращая void* в пространство в памяти, давайте предположим, что размер моего пула соответствует размеру 2*sizeof(Data).
Data* poolTest = new(pool->GetMemory(sizeof(Data))) Data(5, 5, 5);
Таким образом, пул не имеет ссылки на указатель poolTest.
Итак, теперь, если я сделаю это:
pool->Free(poolTest);
Data* poolTest2 = new(pool->GetMemory(sizeof(Data))) Data(4, 5, 5);
Data* poolTest3 = new(pool->GetMemory(sizeof(Data))) Data(3, 5, 5);
Создание poolTest3 вызывает перераспределение памяти, и теперь poolTest2 указывает на тот же адрес, что и poolTest3, а poolTest1 указывает на адрес, на который должен указывать poolTest2.
Я мог бы просто что-то упустить, или моя структура испорчена, но я действительно застрял на этом.
O(n)
работа, гдеn
- размер любого сегмента памяти разумного размера, на самом деле является довольно высокой стоимостью; обход свободного списка составляет всегоO(n)
по количеству блоков в свободном списке (и на практике вам редко приходится проходить очень далеко), гдеmemmove
составляетO(n)
с точки зрения размера сегмента (и средний случай включает перемещение половины ваших данных). - person ShadowRanger   schedule 08.11.2018