我试图了解实现malloc的内存分配器的代码,我偶然发现了这个宏
// get the size of the block from header
#define GET_SIZE(p) (GET(p) & ~0x7)
评论清楚地说明了它的作用,但我无法理解它的作用或它是如何工作的。有人可以详细解释这个吗?
答案 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++)
之类的内容将导致未定义的行为。此外,它可能会对性能产生一些影响,但现代编译器被认为足够聪明,可以进行这样的优化。