This wasn't noticed: RoundUpTo doesn't produce a constant expression, so the
sizes were not constant either. Enforce them to be static const, replace
RoundUpTo by its expression. The compiler can now optimize the associated
computations accordingly.
Also looking at the produced assembly, PageSize was fetched multiple times
during Allocate, so keep a local value of it. As a result it's fetched once
and kept in a register.
Maybe use constexpr?