Preformance of realloc

Preformance of realloc

本文关键字:realloc of Preformance      更新时间:2023-10-16

看起来realloc不释放旧内存(无论成功还是失败),而vector总是删除旧内存并分配新块。

对于POD数据,我是否可以说realloc的性能优于vector ?

例如:

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

旧的内存p会在这里被释放吗?

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

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

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

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

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