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

http://www.alex-ionescu.com/?p=50 。

我读了一个上面的post。

作者解释了为什么Windows x64仅支持44位虚拟内存地址和单链表示例。


struct {// 8个字节的头部ULONGLONG深度:16; ULONGLONG序列号:9; ULONGLONG NextEntry:39; } Header8;

第一个牺牲是将序列号的空间减less到9位而不是16位,从而减less了列表可以实现的最大序列号。 这仍然只剩下39位指针 – 平均改善超过32位。 通过在分配时强制结构为16字节alignment,可以赢得4个比特,因为底部比特现在总是可以假定为0。


哦,我不明白。

什么“通过强制结构在分配时是16字节alignment的,可以赢得4个比特,因为底部比特总是可以假定为0。 手段?

对于2 ^ N字节对齐的指针,其地址始终可以被2 ^ N整除 – 这意味着低N位总是为零。 您可以在其中存储更多信息:

encode ptr payload = ptr | payload decode_ptr data = data & ~mask decode_payload data = data & mask 

掩码是(1 << N) - 1 – 即设置了低N位的数字。

这个技巧通常用于节省低级代码中的空间(有效载荷可以是GC标记,类型标记等)

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

 16 is 0010000 in binary 32 is 0100000 in binary 64 is 1000000 in binary 

等等

您可以看到,对于所有16的倍数的数字,最后四位始终为零。 所以,而不是存储这些位,你可以把它们留出来,并在使用指针的时候重新加入它们。