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

问题描述 投票:2回答:2

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

windows memory x86-64 memory-alignment virtual-address-space
2个回答
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标记,类型标记等)

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


3
投票
16 is 0010000 in binary

32 is 0100000 in binary

64 is 1000000 in binary

等等

您可以看到,对于16的倍数的所有数字,最后4位始终为零。因此,不是存储这些位,而是可以将它们保留,并在需要使用指针时将它们重新添加。

© www.soinside.com 2019 - 2024. All rights reserved.