首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows x64的44位虚拟内存地址限制

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

Stack Overflow用户
提问于 2010-12-30 14:17:39
回答 2查看 696关注 0票数 2

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

我读了上面的文章。作者解释了为什么Windows只支持44位虚拟内存地址的单链列表示例.

结构{ // 8-字节头超长长:16;超长序列:9;超长长度:39;} Header8;

首先要做出的牺牲是将序列号的空间减少到9位,而不是16位,从而减少列表所能达到的最大序列号。这仍然只留下39位的指针-一个平庸的改进32位以上。通过强制结构在分配时为16字节对齐,可以获得更多的4位,因为底部位现在总是假定为0。

哦,我不明白。

“通过强制结构在分配时是16字节对齐,可以获得4位,因为下面的位现在总是假定为0”。意思是?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-30 14:23:17

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

代码语言:javascript
复制
encode ptr payload = ptr | payload
decode_ptr data = data & ~mask
decode_payload data = data & mask

其中掩码是(1 << N) - 1 -即一个低N位集的数字。

此技巧通常用于在低级代码中节省空间(有效载荷可以是GC标志、类型标记等)。

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

票数 2
EN

Stack Overflow用户

发布于 2010-12-30 14:23:56

代码语言:javascript
复制
16 is 0010000 in binary

32 is 0100000 in binary

64 is 1000000 in binary

你可以看到,对于所有的数字,是16的倍数,最后四位总是零。因此,与其存储这些位元,您可以将它们排除在外,并在使用指针的时候将它们添加回其中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4563297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档