The heap is a memory structure which is organized as a stack. The heap bottom is stored in the variable HeapOrg. Initially the heap pointer (HeapPtr) points to the bottom of the heap. When a variable is allocated on the heap, HeapPtr is incremented by the size of the allocated memory block. This has the e ect of stacking dynamic variables on top of each other.
Each time a block is allocated, its size is normalized to have a granularity of 16 bytes.
When Dispose or FreeMem is called to dispose of a memory block which is not on the top of the heap, the heap becomes fragmented. The deallocation routines also add the freed blocks to the freelist which is actually a linked list of free blocks. Furthermore, if the deallocated block was less then 8K in size, the free list cache is also updated.
The free list cache is actually a cache of free heap blocks which have speci c lengths (the adjusted block size divided by 16 gives the index into the free list cache table). It is faster to access then searching through the entire freelist.
The format of an entry in the freelist is as follows:
PFreeRecord = ^TFreeRecord;
TFreeRecord = record Size : longint; Next : PFreeRecord; Prev : PFreeRecord; end; |
The Next