所以我当时正在考虑用C语言制作我自己的垃圾收集器,并且我从本教程的开头就开始了malloc函数的实现。 本教程的想法是有一个空闲内存块的链接列表,每当您使用malloc时,它都会检查该列表并为您提供所需的内存:
typedef struct header {
unsigned int size;
struct header *next;
} header_t;
{
size_t num_units;
header_t *p, *prevp;
num_units = (alloc_size + sizeof(header_t) - 1) / sizeof(header_t) + 1;
.....
}
alloc_size变量是我们要分配的内存块; num_units变量是您将拥有的列表的“节点”数。我的问题是他们使用的公式,我了解(alloc_size)/ sizeof(header_t)的想法,但是为什么他们还要加上sizeof(header_t)-1和+1。
答案 0 :(得分:1)
这是一种舍入到给定值的下一个多个值的通用机制。
整数除法只是删除任何小数部分,即四舍五入。
这是
alloc_size / unit_size
将得出精确的单位数(如果余数为0)或少于1个单位(在所有其他情况下)。
示例:
8 / 4 => 2 OK | ( 8 + (4-1)) / 4 == 11/4 => 2 OK
9 / 4 => 2 NOK | ( 9 + (4-1)) / 4 == 12/4 => 3 OK
10 / 4 => 2 NOK | (10 + (4-1)) / 4 == 13/4 => 3 OK
11 / 4 => 2 NOK | (11 + (4-1)) / 4 == 14/4 => 3 OK
12 / 4 => 3 OK | (12 + (4-1)) / 4 == 15/4 => 3 OK
在结果中简单地加1意味着只要大小已经是倍数,就浪费1个单位。
最后,他们添加了另一个+1
,以便为标头本身留出空间。
因此,您正在分配1 header_t
的大小,该大小用于存储有关已分配块的信息+分配请求本身的内存。