Статьи / Проектирование аллокатора

Проектирование аллокатора


Отправить ссылку:

Проектирование интерфейса своего аллокатора.

В данной статье речь пойдет об интерфейсе для аллокатора памяти.
В статье не дается реализация аллокатора - этого добра полно в сети, да и написать такую самому не представляется особой сложности. Здесь говорится лишь о том, как правильно спроектировать его интерфейс.
Статья состоит из двух частей. В статье использован язык С++.

Часть первая: Основы

Начнем с того, что свой аллокатор памяти - одна из немногих вещей, которая может реально увеличить производительность программы. Но он дает ещё одно большое преимущество - возможность отлаживать работу с памятью в debug режиме, легко обнаруживая такие ошибки, как повторное освобождение памяти, освобождение памяти по невалидному указателю и т.п. При желании можно отслеживать и такие ошибки как выход за пределы массива.
Конечно, многое из этого может делать, к примеру, отладчик Visual Studio. Но он не сможет точно сказать такую вещь, где была выделена повторно освобождаемая область памяти. А наш аллокатор сможет, но об этом позже.
Начнем с простейшего интерфейса аллокатора.

Особых объяснений данный интерфейс не требует. Если кратко, то метод Alloc - это аналог С функции malloc, ReAlloc - аналог функции realloc, а Free - аналог free.
Чтобы ловить ошибки памяти, нам нужно знать где вызывается каждая из этих функций. А для этого нам нужно имя файла и номер строки. Их можно получить используя макросы:
__FILE__ // имя файла
__LINE__ // номер строки в файле

Дополним интерфейс нашего класса:

Хорошо, теперь при выделении и освобождении памяти мы можем писать:

Таким образом, теперь аллокатор всегда может определить в какой строчке произошла операция и помочь нам найти ошибку. Но недостаток данного подхода очевиден: писать так постоянно чертовски неудобно.
Решить эту проблему нам поможет макрос:

Один из плюсов этого макросса - в релизной версии будут вызываться обычные функции, не требующие, в качестве аргумента, имя файла и номер строки. По идее это должно увеличить производительность (хотя кого я обманываю).
Теперь мы пишем так:

Казалось бы все должны быть счастливы и на этом можно остановиться, но мне такая запись не нравится. Не очень это по ООП-шному, да и не слишком красиво.
Поправим этот недостаток:

Теперь использование аллокатора будет выглядеть так:

По-моему, почти идеально. Помните, что названия MemAlloc, MemReAlloc, MemFree - это макросы. Лучше не давать им такие широко используемые имена как alloc, new и т. д. В будущем из-за этого могут возникнуть проблемы.
Теперь переходим ко второй части статьи.


При полном или частичном копировании необходимо указывать прямую ссылку на данную статью.


Юрий Гузенко.

Юрий (Дата )

Все вопросы и предложения высылайте на адрес soft_support@list.ru. Необходимо в заголовке указать название статьи.

Оставь свой отзыв


Ответьте на вопрос (ответ маленькими буквами)* :
10-1?(ответ цифрами)