http://www.alex-ionescu.com/?p=50。
我读了上面的文章。作者解释了为什么Windows只支持44位虚拟内存地址的单链列表示例.
结构{ // 8-字节头超长长:16;超长序列:9;超长长度:39;} Header8;
首先要做出的牺牲是将序列号的空间减少到9位,而不是16位,从而减少列表所能达到的最大序列号。这仍然只留下39位的指针-一个平庸的改进32位以上。通过强制结构在分配时为16字节对齐,可以获得更多的4位,因为底部位现在总是假定为0。
哦,我不明白。
“通过强制结构在分配时是16字节对齐,可以获得4位,因为下面的位现在总是假定为0”。意思是?
发布于 2010-12-30 14:23:17
对于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标志、类型标记等)。
实际上,您不是在存储指针,而是存储可以从中提取指针的数字。当然,在没有解码的情况下,应该注意不要将数字作为指针取消引用。
发布于 2010-12-30 14:23:56
16 is 0010000 in binary
32 is 0100000 in binary
64 is 1000000 in binary等
你可以看到,对于所有的数字,是16的倍数,最后四位总是零。因此,与其存储这些位元,您可以将它们排除在外,并在使用指针的时候将它们添加回其中。
https://stackoverflow.com/questions/4563297
复制相似问题