Idea 1: Specify up front what you are willing to accept: allocFn(minimum_bytes: usize, minimum_align: usize, extra_min_align: usize) usize `extra_min_align` == 0 means you have to give me exactly `minimum_bytes` `extra_min_align` >= 1 means you can return size >= minimum_bytes but the returned size has to be aligned down to `extra_min_align`. The client must track exactly the returned size. With this, "middleware" allocators have no trouble keeping track of bytes. Idea 2: Return full capacity, but client still has to track requested size: allocFn(minimum_bytes: usize, minimum_align: usize) usize Example, ArrayList requests 10 bytes, allocator gives back 16. ArrayList still has to track 10, but it wants all 16 of those sweet, sweet bytes. So then it has to call resize() to 16 to get them, and now it's allowed to track 16 instead of 10.