realloc的表现

时间:2014-05-29 09:28:10

标签: c++ c memory vector realloc

看起来realloc没有释放旧内存(成功或失败),而vector总是删除旧内存并分配新内存。

我可以说对于POD数据,realloc的效果优于vector吗?

例如:

int *p = malloc(5 * sizeof(int));
...
int *new_p = (int*) realloc(p, 10 * sizeof(int));

旧存储器p是否会被释放?

2 个答案:

答案 0 :(得分:1)

Realloc可以扩展实际分配(如果可能)或者可以分配新块,复制旧块值并释放旧块。在第一种情况下,它具有更好的性能,但是,由于您事先不知道它将要做什么,您必须假设指向旧块的指针将变为无效。

答案 1 :(得分:1)

唯一显着的区别(忽略“语法糖”)是realloc()可能会尝试增加现有区域的大小;和向量不能这样做,因此总是必须分配一个新区域,将旧数据复制到新区域,然后释放旧区域。

基于此,有两种情况realloc()会优越。第一种是当数据很大时(因此复制所有数据都很昂贵)并且能够增加区域的大小可以避免昂贵的复制。

第二种情况是你没有足够的(虚拟)内存来同时存在2个副本。例如,如果您使用的是具有2 GiB空间可用于数据的32位计算机,并且您有1.5 GiB阵列,则您无法分配第二个1.5 GiB阵列(空间不足),并且必须扩展现有区域或失败。

请注意,对于这两种情况(相对较少),realloc()和向量都可能不如其他方法。举一个简单的例子,你可以将它分解成一个巨大的数组,而不是将其分解为“子数组”的链接列表(例如,每个1.5 MiB的1000个“子阵列”的链表,而不是单个1.5 GiB数组;这样可以很容易地创建一个新的“子数组”并将其添加到列表的末尾。当然,其他方法也存在缺点(例如,对于“子阵列的链表”示例,迭代变得稍微复杂一些)。