在单个单词中存储整数和位

时间:2012-11-01 11:44:31

标签: c memory-management malloc

我正在阅读presentation on the implementation of malloc,在幻灯片7中,它建议将区域大小和可用性存储在一个单词中以节省空间。另一种方法是使用两个单词,这是浪费的,因为可用性位只需要为0或1。

这是给出的解释:

  • 如果块对齐,则低位地址位始终为0
  • 为什么要存储一个始终为0的位?
  • 将其用作已分配/免费标记!读取大小字时,必须屏蔽此位

http://courses.engr.illinois.edu/cs241/sp2012/lectures/09-malloc.pdf

但我真的不明白这是如何工作的以及它如何在C中实现。为什么大小整数的一位总是0?

3 个答案:

答案 0 :(得分:3)

  
      
  • 如果块对齐,则低位地址位始终为0
  •   

这是了解它发生了什么的关键。许多CPU要求将多字节原始值存储在可被基元中的字节数整除的地址中:16位基元需要存储在偶数地址中;需要将32位int存储在可被4整除的地址中,依此类推。尝试通过与奇数地址对应的指针访问int会导致总线错误。

在像malloc这样的系统中,必须始终返回一个适合存储给定CPU支持的任何原语的地址。因此,如果CPU支持32位整数,malloc返回的所有地址都必须可被4整除。据说这些地址是对齐。为了遵守,malloc实现填充程序所请求的块大小为0到3个字节,以使长度可被4整除。作为该决定的结果,对齐块的地址的最后两位将始终为零。 malloc的实现可以将这些位用于它自己的目的,只要它们在将结果返回给调用者之前被“屏蔽掉”。

答案 1 :(得分:1)

malloc(3)(由Posix指定)

  • 回归新的记忆;或NULL失败;返回的指针不是程序中任何其他指针的别名
  • 返回一个适当对齐的内存块。对齐约束是编译器,ABI和处理器特定的。 (通常,对齐应该是两个单词)。

尺寸并不总是零。 (实际上,它永远不会为零)。你可以将它四舍五入为两个单词的倍数,并将最后一位用作已使用/空闲位。

但是,malloc返回的指针应该适当对齐,例如到8个字节。所以它们的底部3位为零,malloc - ed区域的分配大小(以字节为单位)是8字节的倍数(高于传递给malloc的请求大小) ,所以最后3位为零(你可以将最后一位用于其他目的,例如使用/空闲位)。

答案 2 :(得分:1)

Why is one bit of the size integer always 0?

我知道为什么这会令人困惑,但我不认为这就是他们在幻灯片7上所说的内容。他们说低阶地址位总是为0.

对象的内存地址与特定边界对齐,这意味着对象与内存地址对齐,内存地址是其大小的倍数。

因此64位整数与8字节边界对齐; 0x7fff315470d8

如果指针始终与8字节边界对齐,则低位3位始终为零。即:0x8 16 = 1000 2

基本上,你可以在那些低位中坚持你想要的东西,只要你在取消引用指针之前取出它们。在64位情况下,您有3位始终为0,因此您可以存储3个“标志”。在这个功率点的情况下,他们说采取最低位并将其用作“已分配”标志。只要分配了内存,就在其中粘贴1,当您将指针发送给用户时将其屏蔽掉。