内存分配器宏解释

时间:2016-03-13 22:52:05

标签: c macros malloc

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

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

评论清楚地说明了它的作用,但我无法理解它的作用或它是如何工作的。有人可以详细解释这个吗?

1 个答案:

答案 0 :(得分:3)

在二进制文件中,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++)之类的内容将导致未定义的行为。此外,它可能会对性能产生一些影响,但现代编译器被认为足够聪明,可以进行这样的优化。