Нет, FastMM4 (в последней версии, на которую я смотрел) явно не поддерживает это. Это действительно не та функциональность, которую вы ожидаете в диспетчере памяти общего назначения, поскольку ее довольно просто делать с вызовами VirtualAlloc.
NexusMM4 (который является частью NexusDB) делает то, что дает аналогичный результат, но не тратит все адресное пространство до того, как оно понадобится в фоновом режиме.
Если вы делаете начальное большое выделение (напрямую через GetMem или косвенно через динамический массив или тому подобное), то память выделяется только необходимого размера через VirtualAlloc.
Но если это распределение затем изменится до большего размера, NexusMM будет использовать другой способ выделения памяти, который позволит ему просто отобразить выделение из адресного пространства и переназначить его снова, с большим размером, когда дальнейшие перераспределения потребуют место.
Это предотвращает две основные проблемы, которые возникают у большинства диспетчеров памяти общего назначения при перераспределении:
- во время обычного перераспределения существующее и новое распределение должны присутствовать в адресном пространстве одновременно, временно удваивая адресное пространство и требования к физической памяти
- во время обычного перераспределения необходимо скопировать все содержимое существующего выделения
Таким образом, с NexusMM вы получите все преимущества того, что вы показали в своем псевдокоде (за исключением того, что первый realloc будет включать в себя копию, и что увеличение массива может изменить его адрес), просто используя обычный GetMem / ReallocMem / FreeMem звонки.