Входной файл: | Стандартный вход | Ограничение времени: | 1 сек | |
Выходной файл: | Стандартный выход | Ограничение памяти: | 4000 Мб |
Аллокатор — это класс, который инкапсулирует управление памятью.
Известная проблема аллокации для связных списков состоит в том, что при интенсивных операциях вставки и удаления может возникнуть эффект фрагментации системной памяти. Чтобы снизить влияние этого эффекта, предлагается запрашивать у операционной системы память на группу объектов и оперировать полученным буфером, что также снижает количество системных вызовов.
Необходимо реализовать класс FixedAllocator, который будет использовать необходимое количество непрерывных буферов как пул памяти для элементов списка. Размер страницы (размер одного непрерывного буфера), как и размер объектов, передается аллокатору как параметр конструктора.
Определение класса должно содержать следующие методы:
FixedAllocator(size_t chunk_size, size_t page_size)
— конструктор, принимающий размер страницы памяти и размер одного объекта;
void* Allocate()
— возвращает указатель на свободный участок
памяти для одного элемента размера chunk_size;
void Deallocate(void*)
— возвращает в пул память, занимаемую элементом.
Список использует метод Allocate
, когда необходимо получить
память для одного элемента, и Deallocate
, когда память нужно
освободить.