http://www.alex-ionescu.com/?p=50。
我看过上面的帖子。作者解释了为什么Windows x64仅支持带有单链表示例的44位虚拟内存地址。
struct { // 8-byte header ULONGLONG Depth:16; ULONGLONG Sequence:9; ULONGLONG NextEntry:39; } Header8;
要做的第一个牺牲是减少序列的空间 数字为9位而不是16位,减少了最大序列 列表可以实现的数字。这仍然只留下了39位 指针 - 超过32位的平庸改进。通过强迫 结构在分配时为16字节对齐,可以有4个比特 赢了,因为现在可以假设底部位为0。
什么“通过在分配时强制结构为16字节对齐,可以赢得4个以上的位,因为现在总是假设底部位为0”。手段?
答案 0 :(得分:3)
16 is 0010000 in binary
32 is 0100000 in binary
64 is 1000000 in binary
等
您可以看到,对于16的倍数的所有数字,最后4位始终为零。 因此,不是存储这些位,而是可以将它们留出来,并在需要使用指针时将它们重新添加。
答案 1 :(得分:2)
对于2 ^ N字节对齐的指针,其地址始终可被2 ^ N整除 - 这意味着较低的N位始终为零。您可以在其中存储其他信息:
encode ptr payload = ptr | payload
decode_ptr data = data & ~mask
decode_payload data = data & mask
其中mask是(1 << N) - 1
- 即设置了低N位的数字。
此技巧通常用于节省低级代码中的空间(有效负载可以是GC标记,类型标记等)。
实际上,您不是存储指针,而是存储可以从中提取指针的数字。当然,应该注意不要将数字取消引用作为指针而不解码。