you will only get the 63 byte chunk if you request a chunk of size 60-63. E.g. you free 63 bytes then request 61 bytes, you will get a chunk of size 63 so you lose 2 bytes. When you free that again you register it as a 61 byte chunk so it goes into the same bucket it came from.

an issue is that if you allocate and free non-multiples of 4 and the cache doesn't contain larger sizes from other allocations you will not use the cache at all. Though most sizes are multiples of 4 so its not a big problem. On the other hand it would be an argument for only caching only multiples of four as other sizes are not cached effectively by applications working on uniform array sizes. Storing the size and doing a linear lookup would also help but as these are very small allocations it would probably negate a significant part of the speedup.