关于heap_info
#733
Replies: 1 comment 1 reply
-
@ClarkCh 分析得挺好的鸭~ 可以给 Wiki 提个 PR 么~ |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
原文:
"
该结构主要是描述堆的基本信息,包括
"
这里负数使用的缘由是什么呢?
研究了好二十分钟才理解,主要是这个写法太骚脑了..先根据注释中that sizeof (heap_info) + 2 * SIZE_SZ is a multiple of
可以理解他想表达的是6个指针的空间, 再加占位符,目前没想到为什么对齐为16位,
但是我们可以直接分析他的式子-6 * SIZE_SZ & MALLOC_ALIGN_MASK
其实想表达的是占位数量为 16 * x - 6 * SIZE_SZ
其中x是任意自然数,这最终就可以导致16位对齐
注意,由于16 * x这个数在任意时候都是16的倍数,所以他在以16为模的运算中,必然是溢出的,且溢出后结果必然为0
所以结果就是0 - 6 * SIZE_SZ
注意上一行的推理的前提是以16为模,否则结果肯定和原来的方案不同,所以就变成了(- 6 * SIZE_SZ) % 16
或者这样写
pad
= (16 * x - 6 * SIZE_SZ) % 16 # 最后取模是为了把可能的负数结果取值为正数
= 16 * x % 16 - 6 * SIZE_SZ % 16 # 上一个式子里结果必然是正数,这个式子里可能会是模运算后的正数或者是模运算对应结果的负数(事实上一定是模运算得到正数结果之前的负数,比如%8的正数结果3,那么他的负数结果可以是-5,他们只是表达有所不同)
= (0 - 6 * SIZE_SZ )% 16 # 为了把上式的模运算负数结果变为正数结果,再取模一次就好了,反正同一个模运算多几次结果都是一样的。
= -6 * SIZE_SZ % 16
为了保证结果是自然数,负号的运算必须在求余之前
Beta Was this translation helpful? Give feedback.
All reactions