在Windows x64';s 44位虚拟内存地址限制

在Windows x64';s 44位虚拟内存地址限制,windows,memory,x86-64,memory-alignment,virtual-address-space,Windows,Memory,X86 64,Memory Alignment,Virtual Address Space,我读了上面的帖子。作者以单链表为例解释了为什么Windowsx64只支持44位虚拟内存地址 首先要做的牺牲是减少序列的空间 将数字改为9位而不是16位,从而减少最大序列 名单上能达到的数字。这仍然只剩下39位 指针-超过32位的普通改进。通过强迫 结构为16字节对齐,当分配时,可以再增加4位 韩元,因为现在可以始终假定底部位为0 哦,我不明白 “通过在分配时强制结构为16字节对齐,可以再赢得4位,因为底部位现在可以始终假定为0。”这是什么意思 对于2^N字节对齐指针,其地址始终可被2^N整除-

我读了上面的帖子。作者以单链表为例解释了为什么Windowsx64只支持44位虚拟内存地址

首先要做的牺牲是减少序列的空间 将数字改为9位而不是16位,从而减少最大序列 名单上能达到的数字。这仍然只剩下39位 指针-超过32位的普通改进。通过强迫 结构为16字节对齐,当分配时,可以再增加4位 韩元,因为现在可以始终假定底部位为0


哦,我不明白


“通过在分配时强制结构为16字节对齐,可以再赢得4位,因为底部位现在可以始终假定为0。”这是什么意思

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

encode ptr payload = ptr | payload
decode_ptr data = data & ~mask
decode_payload data = data & mask
其中掩码是
(1
等

您可以看到,对于所有16的倍数,最后四位始终为零。
因此,不用存储这些数据,你可以将它们保留下来,在使用指针时再添加回来。

我喜欢让我大吃一惊的问题。学习新东西总是很好的。
encode ptr payload = ptr | payload
decode_ptr data = data & ~mask
decode_payload data = data & mask
16 is 0010000 in binary

32 is 0100000 in binary

64 is 1000000 in binary