Допустим, у меня есть программа (например, C++), которая выделяет несколько объектов, никогда не превышающих заданный размер (назовем ее MAX_OBJECT_SIZE).
У меня также есть регион (я назову его «страницей») в куче (выделенный, скажем, malloc(REGION_SIZE), где REGION_SIZE >= MAX_OBJECT_SIZE).
Я продолжаю резервировать место на этой странице до тех пор, пока не будет заполнено пробел равен PAGE_SIZE (или, по крайней мере, > PAGE_SIZE - MAX_OBJECT_SIZE).
Теперь я хочу выделить больше памяти. Очевидно, моей предыдущей "страницы" будет недостаточно. Так что у меня как минимум два варианта:
- Используйте realloc(page, NEW_SIZE), где NEW_SIZE > PAGE_SIZE;
- Выделите новую «страницу» (page2) и поместите туда новый объект.
Если бы я хотел иметь пользовательскую функцию выделения, то:
- Используя первый метод, я бы увидел, сколько я заполнил, а затем поместил туда свой новый объект (и добавил размер объекта к моей заполненной переменной памяти).
- Используя второй метод, я бы получил список (вектор? Массив?) страниц, затем искал текущую страницу, а затем использовал метод, аналогичный 1 на выбранной странице.
В конце концов, мне также понадобится метод для освобождения памяти, но я могу понять эту часть.
Итак, мой вопрос: Каков наиболее эффективный способ решения подобной проблемы? Это вариант 1, вариант 2 или какой-то другой вариант, который я здесь не рассмотрел? Требуется ли/достаточен ли небольшой контрольный показатель, чтобы делать выводы для реальных ситуаций? Я понимаю, что разные операции могут выполняться по-разному, но мне нужен общий показатель.