最近,我研究了旨在优化矢量的FBvector。
在文档中,他们选择1.5作为增长规模的因素。他们不使用2的原因是因为2 ^ n(需要下一个大小)总是大于请求前的总和(1 + 2 + 4 ... + 2 ^(n-1))。这导致新请求无法重用以前的内存。
但是我发现了一些奇怪的东西:
int *p = malloc(sizeof(1));
printf("%p\n",p);
p = realloc(p, 2);
printf("%p\n",p);
p = realloc(p, 4);
printf("%p\n",p);
p = realloc(p, 8);
printf("%p\n",p);
输出:
0x7b3010
0x7b3010
0x7b3010
0x7b3010
这意味着即使我们选择因子2,智能重分配仍将重用先前分配的内存,并在原始尾部之后附加更多内存。
我的问题是,即使我使用2作为因子,这真的很重要吗?如果我需要增加向量,则在[[内存重用方面中,我们选择的大小之间有区别吗?
realloc
(或等效值),并且还假定新的块通常位于前一个块之后:[有请求增长向量的请求时,向量(假定不进行就地调整大小,请参阅本文档的相应部分)将在其当前块旁边分配一块内存,将其现有数据复制到新块,然后重新分配旧块。
您正在使用的内存分配器在您进行测试的情况下不会表现出这种行为,因此,文档的结论不希望对此保留。