Растущий (и сокращающийся) пул памяти

Допустим, для цели вопроса у нас есть пул памяти, в котором изначально было выделено n блоков. Однако, когда емкость достигнута, пул хочет увеличиться и стать в два раза больше, чем был (2n).

Теперь эту операцию изменения размера можно выполнить с realloc в С, однако, сама функция может возвращать указатель на другую память (со скопированными старыми данными).

Это означает, что указатели, возвращаемые распределителем пула памяти, могут больше не быть действительными (так как память могла быть перемещена).

Что было бы хорошим способом преодолеть эту проблему? Или это вообще возможно?

2 ответа

Решение

Выделите из нескольких несмежных пулов памяти. Когда один пул заполнен, выделите второй пул, что позволит ему находиться где-то еще в вашем виртуальном адресном пространстве.

Тогда проблема заключается в том, чтобы отслеживать, где находятся ваши бассейны. Как правило, вы использовали бы часть пространства в каждом пуле для бухгалтерии. Например, вы можете зарезервировать место на один указатель, чтобы сохранить простой линейный связанный список всех пулов. Более сложные распределители, как правило, требуют больших затрат на ведение бухгалтерского учета.

Вместо использования realloc, malloc - новый / дополнительный блок блоков (при условии, что нет причин, по которым блоки, которые управляются и возвращаются и возвращаются вашим распределителем пула, должны находиться в одном непрерывном фрагменте памяти).

Другие вопросы по тегам