Распределитель памяти TGsvHeap реализует кучу, из которой можно выделять память кусочками любого размера, но освобождать можно только всю кучу целиком. Внутренний алгоритм работы распределителя основан на выделении памяти непосредственно от операционной системы (минуя распределитель памяти Delphi) большими блоками (минимум 64 кб). Скорость выделения небольших кусочков памяти очень высокая и сводится, фактически, к увеличению указателя свободного места, подобно тому, как это происходит в распределителе памяти .NET. Основная мотивация разработки кучи - получение максимально высокой скорости выделения памяти кусками произвольной длины. Куча без частичного возврата памяти позволяет не заботиться об освобождении выделенных кусков памяти и может быть основой для создания в приложении инфраструктуры сборки мусора.
При выделении памяти анализируется размер свободной области последнего выделенного блока. Если размер свободной области меньше, чем требуемый размер памяти, то выделяется новый блок. Память, остающаяся в предыдущем блоке, теряется для распределения. Размер нового блока должен удовлетворять критериям:
Основной метод класса TGsvHeap - функция Alloc
Alloc(aSize: Cardinal): Pointer
Эта функция возвращает указатель на кусок памяти указанного размера, выровненного с учетом параметра Align. При необходимости функция выделяет новый блок. Функция AllocCopy не только выделяет память нужного размера, но и также копирует в него переданные данные. Дополнительно в классе имеются перегруженные функции выделения-копирования памяти для строк. Распределитель существует в двух вариантах - однопоточном и многопоточном.
delphiheap.zip - Исходные тексты (3K).