Windows поддерживает динамическое распределение памяти с помощью двух различных динамически распределяемых областей - глобальной и локальной.
Глобальная динамически распределяемая область - это пул памяти, доступной для всех приложений. Хотя могут распределяться
глобальные блоки памяти любого размера, глобальная динамически
распределяемая область предназначена только для больших блоков
памяти (256 байт или более). Каждый блок глобальной памяти дополнительно использует не менее 20 байт. В соответствии со стандартом Windows и улучшенными режимами процессора 386 существует системное ограничение в 8192 блока глобальной памяти, только некоторые из которых будут доступны для любого конкретного приложения.
Локальная динамически распределяемая область - это пул памяти, доступной только для вашего приложения. Она существует только
в верхней части сегмента данных приложения. Общий размер блоков
локальной памяти, которые могут распределяться в локальной динамической области - это 64 минус размер стека приложения и его
статических данных. По этой причине локальная динамически распределяемая область лучше подходит для небольших блоков памяти (256
байт и менее). По умолчанию локальная динамически распределяемая
область имеет размер 4К, но в файле .DEF приложения его можно изменить.
Borland C++ включает в себя администратор памяти, реализующий функции new, delete, malloc и free. Этот администратор динамически распределяемой памяти использует для всех приложений глобальную динамически распределяемую область. Поскольку такая область имеет системное ограничение, администратор динамически
распределяемой памяти включает в себя механизм вторичного распределения, улучшающий производительность и позволяющий выделять существенно большее число блоков.
Алгоритм вторичного распределения работает следующим образом: при выделении большого блока администратор динамически распределяемой памяти с помощью подпрограммы Windows GlobalAlloc выделяет блок глобальной памяти. При выделении небольшого блока администратор памяти выделяет более крупный блок глобальной памяти,
а затем при необходимости разбивает этот блок на блоки меньшего
размера. При выделении небольших блоков перед тем, как администратор выделит новый блок глобальной памяти (который также будет
вторично распределяться), повторно используется все доступное
пространство вторичного распределения.
Пороговое значение между большим и малым блоком динамически
распределяемой памяти определяет переменная HeapLimit. Она устанавливается равной 64 байтам. Переменная HeapBlock определяет
размер, используемый администратором динамически распределяемой
памяти при вторичном распределении. Ей присваивается значение
4096 байт.