Many "64-bit" systems only have ~48 bits of virtual address space, and while canonical pointers have all the high bits equal, you can put the otherwise-wasted bits to work by storing metadata.
If you're writing really space-optimised code, you can pack pointers closer together.
If you're writing really space-optimised code, you can pack pointers closer together.