最近,我研究了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作为因子,这真的很重要吗?如果我需要增加向量,则在内存重用方面中,我们选择的大小之间有区别吗?
答案 0 :(得分:0)
链接到的文档对内存分配器的行为进行了假设;它假设分配器通过总是分配一个新的内存块并将旧数据复制到新的内存中来实现realloc
(或同等功能),并且还假设新的块通常位于前一个块之后:
当请求增长向量时,向量(假设没有就地调整大小,请参见本文档的相应部分)将在其当前块旁边分配一个内存块,将其现有数据复制到新块中,然后重新分配旧块。
您正在使用的内存分配器在您测试的情况下不会表现出这种行为,因此,文档的结论不希望对此保留。