落后于Windows x64的44位虚拟内存地址限制

时间:2010-12-30 14:17:39

标签: windows memory x86-64 memory-alignment virtual-address-space

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”。手段?

2 个答案:

答案 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标记,类型标记等)。

实际上,您不是存储指针,而是存储可以从中提取指针的数字。当然,应该注意不要将数字取消引用作为指针而不解码。