我正在阅读有关Malloc实现的演示文稿,并且在幻灯片7上,它建议将区域的大小和可用性存储在一个单词中以节省空间。替代方法是使用两个单词,这很浪费,因为可用性位只需0或1。
。这是给定的解释:
- 如果块对齐,低阶地址位始终为0
- 为什么要存储一个始终0位?
- 将其用作分配/免费标志!阅读尺寸的单词时,必须掩盖这个位
http://courses.engr.illinois.edu/cs241/sp2012/lectures/09-malloc.pdf
,但我并不真正了解它是如何工作的,以及如何在C中实现。为什么一个大小的整数总是0?
- 如果块对齐,低阶地址位始终为0
这是理解它发生的事情的关键。许多CPU要求将多型原始值存储在原始字节数量的地址上,可以将16位原始词存储在偶数地址上;32位int
S需要存储在四个地址,依此类推。尝试通过与奇数地址相对应的指针访问int
导致总线错误。
在这样的系统中,malloc
必须始终返回适用于存储给定CPU支持的任何原始的地址。因此,如果CPU支持32位整数,则malloc
返回的所有地址都必须由4
排除。据说此类地址是对齐的。为了遵守程序,该程序在末尾要求的malloc
实现板尺寸块由0到3个字节,以由4
除以长度。由于这一决定,对齐块的地址的最后两个位将始终为零。malloc
的实现可以将这些位用于自身目的,只要将结果"掩盖"在将结果退还给呼叫者之前。
malloc(3)(如Posix所指定)应
- 返回新的内存块;或
NULL
失败;返回的指针不是程序中任何其他指针的别名 - 返回适当对齐的内存块。对齐约束是编译器,ABI和处理器的特定于编译器。(通常,对齐应该是两个词)。
大小并不总是零。(实际上,它永远不会为零)。您可以将其四舍五入到两个单词中的一个中,并将最后一块用作二手/免费位。
但是,malloc
返回的指针应适当对齐,例如到8个字节。因此,它们的底部3位为零,并且在malloc
-ED区域的字节中分配的大小为8个字节的倍数(高于所请求的大小传递给malloc
),因此最后3位为零(您可以将最后一位用于其他目的,例如用过/免费的位)。
Why is one bit of the size integer always 0?
我明白了为什么这会令人困惑,但我不认为这是他们在幻灯片上说的7。P>
对象的内存地址与特定边界对齐,这意味着对象与其大小的多个内存地址对齐。
因此,将一个64位整数排列到八字节边界;0x7fff315470d8
如果指针始终与八字节边界对齐,则低阶三位始终为零。即:0x8
基本上,您可以在那些低阶的碎屑中粘贴任何想要的东西,只要您将它们取出,然后再删除指针即可。在64位的情况下,您有3个始终为0的位,因此您可以存储3个"标志"。在此功率点的情况下,他们说要把最低的位用于"分配"标志。只要分配内存,就将1固定在其中,请在将指针发送给用户时将其掩盖。