【问题标题】:Memory allocator macro explaination内存分配器宏解释
【发布时间】:2016-03-13 22:52:04
【问题描述】:

我试图理解实现 malloc 的内存分配器的代码,但偶然发现了这个宏

// get the size of the block from header
#define GET_SIZE(p)  (GET(p) & ~0x7)

评论清楚地说明了它的作用,但我无法理解它的作用或工作原理。谁能详细解释一下?

【问题讨论】:

  • 它提取除 get(p) 返回的值的最右边 3 个二进制数字之外的所有内容。大约可以更快地完成 (p) % 8。
  • @ArifBurhan 那么 ~0x7 到底做了什么?我的意思是返回最右边的 3 个数字的逻辑是什么?
  • @ArifBurhan “做得更快” - 如果您使用的是 1970 年代的编译器,也许
  • @ArifBurhan 不,它们相同。使用for (x = 0;;++x)x & ~0x7 产生 [0 重复 8 次]、[8 重复 8 次]、[16 重复 8 次]、24 重复 8 次],...但 x % 8 是 [0,1,2 ,3,4,5,6,7], [0,1,2,3,4,5,6,7], [0,1,2,3,4,5,6,7], [0 ,1,2,3,4,5,6,7], ...您可能错过了~

标签: c macros malloc


【解决方案1】:

二进制中0x7.... 0000 0111~0x7.... 1111 1000,所以GET(p) & ~0x7的值是GET(p)“屏蔽掉”它最右边的三个位,也就是设置它们归零。

例如,如果GET(p) 产生 10,即.... 0000 1010,则GET_SIZE(p) 将是8,其二进制表示为.... 0000 1000

这与GET(p) - GET(p) % 8 类似,但在这种情况下GET(p) 被评估一次。如果GET_SIZE(p) 定义为GET(p) - GET(p) % 8,则GET_SIZE(i++) 之类的内容将导致未定义的行为。此外,它可能会对性能产生一些影响,但现代编译器被认为足够聪明,可以进行这样的优化。

【讨论】:

  • ~7 表示将 7 按位取反,& 具有位掩码的作用,让一部分通过,而阻止其他。
  • 谢谢!这个例子使它更容易理解!
  • 大部分包含文件是在七十年代编写的,从未重写,以防止新的错误蔓延。
猜你喜欢
  • 2011-09-16
  • 2018-01-23
  • 2018-10-28
  • 2011-12-09
  • 1970-01-01
  • 2013-04-28
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多