【发布时间】:2011-10-06 17:04:31
【问题描述】:
我有一个函数,它需要一个字符串数组(buffer)并且需要增加它的大小。 所以我调用了一个 realloc
temp = (char**) realloc (buffer, newSize * (sizeof(char*)));
if (temp == NULL)
return false;
else
buffer = temp;
到目前为止,一切都很好。现在,对于每个新单元格,我必须调用具有正确大小的 malloc。请注意,newSize 始终是偶数,并且奇数字符串的长度与偶数字符串的长度不同。
for (i = oldSize; i < newSize; i++){
support = (char*) malloc (LENGTH1 * sizeof(char));
if (support == NULL){
marker = i;
failedMalloc = true;
break;
}
else
buffer[i] = support;
i++;
support = (char*) malloc (LENGTH2 * sizeof(char));
if (support == NULL){
marker = i;
failedMalloc = true;
break;
}
else
buffer[i] = support;
}
事实是,由于我迟早会处理大量数据,因此我将完成内存,而 realloc 或其中一个 malloc 将失败。问题是,如果它是失败的 malloc 之一,那么我将不得不调用 数百万 的 free 来清理一些内存。这需要很多时间。有什么方法可以加快这个过程,甚至更好地避免它?
if (failedMalloc){
for (i = oldRows; i < marker; i++)
free(buffer[i]);
temp = (char**) realloc (buffer, oldRows * (sizeof(char*)));
}
PS:是的,我知道指针运算比数组索引更快。当我找到解决这个问题的方法时,我会实现它,目前我更喜欢使用数组索引,因为我找到了不易出错。但最终版本会使用指针算法
【问题讨论】:
-
指针算法并不比数组索引快
-
@sth,我在我的基准测试中发现了同样的事情——x86 架构在指令级内置了索引,所以如果你无论如何都要循环索引,你可以免费获得它.
标签: c arrays performance resize realloc