C语言 内存分配器宏解释



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

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

该评论清楚地说明了它的作用,但我无法理解它的作用或工作原理。有人可以详细解释一下吗?

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

相关内容

  • 没有找到相关文章

最新更新