Skip to content

ДЗ Аллокатор

xphoenix edited this page Sep 13, 2017 · 1 revision

Домашнее задание 1 - аллокатор

Интерфейс аллокатора находиться в include/allocator:

  • Error.h - исключение, которое должен бросать аллокатор при возникновении ошибок, например когда больше нет памяти. Сюда можно добавлять новые типы ошибок, если нужно
  • Pointer.h - интерфейс "умного" указателя, которые возвращает аллокатор. Фактически, это обертка над указателем нужная для поддержки дефрагментации
  • Simple.h - интерфейс простого аллокатора

Задача

Аллокатору отдается блок памяти (base) заданного размера (len) под управление:

Simple(char *base, size_t len)

В рамках этого блока, аллокатор реализует следующие операции:

  • Выделить кусок памяти запрошенного размера. Если это невозможно, запрошенно больше чем есть свободной памяти, то бросить исключение. Если памяти достаточно, но она фрагментированна - выполнить дефрагментацию и потом выделить
  • Изменить размер выделенной ранее области, уменьшить или увеличить. При этом нужно, по возможности, избегать копирования блоков памяти.
  • Освободить ранее выделенную область памяти
  • Дефрагментировать весь управляемый блок памяти

Нужно написать реализацию аллокатора по любой из схем, которые обсуждали на лекции (или любой другой, которая уместится в заданный интерфейс), при этом:

  • В реализации можно использовать только память, выданнуюю аллокатору для управления
  • Стэк

Реализация должна распологаться в src/allocator/{Pointer.cpp, Simple.cpp, ...}.

Тесты

Тесты находятся в test/allocator и собираются в цель runAllocatorTests:

[user@domain build] make runAllocatorTests
[user@domain build] ./test/allocator/runAllocatorTests