This allocator has a list of chunks (fixed size committed memory regions) and each chunk keeps a list of free ranges. Allocations are served by finding a large enough free range and sub-allocating from it. Freed allocations become free ranges and are combined with adjacent free ranges if possible. It is meant to be a faster version of TGenericGrowableAllocator but imposes some restrictions on size and alignment. The restrictions are that alignments must be power of two, ChunkSize must be a multiple of MinAlignment, and the quotient of dividing ChunkSize by MinAlignment must be representable by a 16-bit unsigned integer. Note that allocations smaller than MinAlignment will be padded to MinAlignment and it cannot allocate larger than ChunkSize. It is advised to use multiple instances of range allocators where each handles a range of allocation sizes (e.g. three allocators for allocations smaller than 1 KB, between 1 KB and 128 KB, and between 128 KB and 1 MB, respectively). Doing so usually lead to better performance and less fragmentation.