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