layout: post title: Tagged Pointer原理及其應用 categories: [dev]
在現代的 x86-64 CPU 架構中,指標的大小為 64 位元,但 CPU 支援的記憶體位址範圍並不完全達到 64 位元,實際上目前只支援到 48 位元的虛擬位址。這意味著我們可以利用剩餘的 16 位元(64 - 48)來存儲額外的資料,只需在實際存取記憶體前將這些額外資料移除。
此外,記憶體對齊(memory alignment)是另一個關鍵因素。為了獲得更高的存取效率,記憶體地址需要按照一定的邊界對齊。例如,在 64 位元 CPU 上,記憶體地址會對齊到 8 Bytes(即 64 位元)邊界。這導致記憶體分配器不會分配像 0x12341111 這樣的地址,而會分配像 0x12341110 這樣對齊的地址。因此,在 64 位元 CPU 上,地址的最低 3 位元(對應於 8 Bytes對齊)不會被使用。這樣的對齊策略進一步提升了記憶體存取的效率,並為指標上的資料標記提供了可能性。
這適用於某些特殊的場景,例如:
https://muxup.com/2023q4/storing-data-in-pointers https://github.com/golang/go/blob/master/src/runtime/tagptr_64bit.go