If you wrote an application that's as efficient as possible without any wasted bits in the size_t type, it then only works on your machine.
If I wanted to run such an application on my supercomputer with 2TB of RAM (such machines exist), I would then have to recompile for a 41-bit size_t.
We use machine-neutral (but architecture-specific) size_t for these kinds of things explicitly to avoid recompiling on different machines that are instances of the same platform.
Said another way, binary distributions could not exist if everything was made efficient for the underlying hardware. It would stink to have to recompile the world after upgrading RAM.
I'd rather have a few bits of wasted space (which are typically lost anyway due to struct packing) than lose intra-platform comparability.