1 | /* |
下面这块代码用到了整型数的除法操作会抹去小数的特点。
1 | asize = DSIZE * ((size + (DSIZE) + (DSIZE-1)) / DSIZE); |
其目的是为了申请一块按 DSIZE 字节大小对齐的内存,正向推导是没问题的,不过我想知道为啥会想到这样去写?
仔细想了想,用小学的除法知识就能很好的解释这段代码,当size
能被 DSIZE
整除时,size+DSIZE
除以 DSIZE
的余数是 0
,这时的 asize
就是 size + DSIZE
, 而当size
不能被 DSIZE
整除时,size+DSIZE
除以 DSIZE
的余数范围一定是落在 [1, DSIZE-1]
之间,这样一来余数加上 DSIZE-1
的范围就落在了 [DSIZE, 2DSIZE-2]
之间, 这个范围去除以 DSIZE
的结果必定是 1
,此时的 asize
就是 size+1+DSIZE
。
也就达到来了代码的目的,按 DSIZE
字节对齐方式申请内存大小。