compaction/coalescing, whatever....
Back in the 1990s, I used a compiler that did not
defragment its internal free list. It's algorithm
for managing memory ensured that no matter how well
the application ensured things were deallocated, the
free list would get longer and longer and more and
more fragmented, and allocations would get slower
and slower until there was no memeory left.
When we complained to the vendor, they sent us a
package containing nothing but two pragmas. By
withing that package into our main program, we
caused the linker to use malloc and free instead
of the vendor's run-time manager.
Result: thread-safe, efficient, reliable, RM-compliant
memory management! So why on earth did they do what
they did in the first place?