Tagged pointer is a technique to pack additional information into a pointer value.
If all allocations are 4- or 8-bytes aligned, the low 2 or 3 bytes are always zero. Language runtime can use this information to cram additional information into a pointer—i.e., tag what pointer value actually means.
- 2 low bits are 0: the value is pointer
- 1 low bit is 1: the value is 31-bit integer (assuming 32-bit pointers), or the value is 32-bit integer stored in upper half
- the lowest 2 bits are 10: 30 other bits mean something else
- ARM uses the least-significant bit to switch between ARM/Thumb
- 64-bit machines don’t use full 64-bit address space—there are even more unused bits that can be used for tags