The best system involves keeping end pointers, not lengths. Remaining length changes. End pointer never changes. At previous job we converted our whole code base to this system, and it worked great.
I'll consider this idea and write some comparisons to see how it works, thanks.