分配字符串数组的最快方法

时间:2011-10-06 17:04:32

标签: c arrays performance resize realloc

我有一个函数,它接受一个字符串数组( 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将会失败。问题在于,如果它是mallocs之一,那么失败的那个就是我必须调用数百万的免费来清理一些内存的风险。这需要很多时间。有没有办法加快这个过程,甚至更好地避免它?

if (failedMalloc){
    for (i = oldRows; i < marker; i++)
        free(buffer[i]);
    temp = (char**) realloc (buffer, oldRows * (sizeof(char*)));
}

PS:是的我知道指针算法比数组索引更快。当我找到解决这个问题的方法时,我会实现它,目前我更喜欢使用数组索引,因为我发现它不容易出错。但最终版本将使用指针算法

4 个答案:

答案 0 :(得分:4)

不是单独分配每个字符串,而是在块中分配它们。例如,你可以使用malloc 128 *(LENGTH1 + LENGTH2),并有256个连续字符串的空间。每当你的索引越过块边界时,malloc另一个大块并使用模运算来为它的字符串开始获取偏移量。

P.S。 sizeof(char)保证为1。

答案 1 :(得分:1)

分配更大的内存块。 malloc调用越少越好。最快的是预先计算所需的大小并仅分配一次。

此外,使用指针运算不会产生任何明显的差异。

答案 2 :(得分:0)

您可以编写自己的分配和释放例程,并使用它们而不是malloc/free作为字符串。如果你的例程malloc有一个或多个大缓冲区,并将其中的一小部分分开,那么你可以通过在每个大缓冲区上调用free一次性释放整个批次。

在所有分配大小相同的情况下,总体思路特别有效,在这种情况下,它被称为“池分配器”。在这种情况下,对于每个数组或字符串,您可以为LENGTH1分配设置一个关联池,为LENGTH2设置另一个关联池。

我说,“编写自己的”,但毫无疑问,这里有简单的开源池分配器。

答案 3 :(得分:0)

避免浪费内存的一种方法是每当需要malloc时使用malloc更大的内存,

malloc固定大小(对齐2 ^ n),例如

int m_size = 1;

// when need malloc
while (m_size < require_size) m_size * 2;
malloc(m_size);