使用 malloc 和 realloc 之间有什么性能差异吗?

is there any performance difference between using malloc versus realloc?

提问人:Alessandro 提问时间:7/9/2023 最后编辑:RobAlessandro 更新时间:7/11/2023 访问量:101

问:

我有这个功能:

int program_inc_capacity(Program *program)
{
    Instruction *v_old = program->v;

    size_t capacity_new = 2 * program->capacity;

    program->v = (Instruction *)malloc(capacity_new * sizeof(Instruction));
    if (program->v == NULL)
        return 0;

    for (size_t i = 0; i < program->size; i++)
    {
        program->v[i] = v_old[i];
    }

    free(v_old);

    program->capacity = capacity_new;

    return 1;
}

当之前分配给 program->v 的内存不够时,我调用上述函数。因此,我通过 malloc 重新分配整个内存块,使其翻倍。

我没有使用这种方法,而是考虑使用 . 因此,代码将如下所示:realloc()

int program_inc_capacity(Program *program)
{
    Instruction *v_old = program->v;

    size_t capacity_new = 2 * program->capacity;

    Instruction *temp = (Instruction *)realloc(v_old, capacity_new * sizeof(Instruction));
    if (temp == NULL) {
        printf("Memory reallocation failed!\n");
        free(v_old);  // Free the original memory
        return 1;
    } else {
        v_old = temp;  // Update the pointer with the new memory location
    }

    for (size_t i = 0; i < program->size; i++)
    {
        program->v[i] = v_old[i];
    }

    free(v_old);

    program->capacity = capacity_new;

    return 1;
}

所以,我的问题是:有什么性能差异吗?在哪种情况下,第一种方法比第二种方法更好,反之亦然? 我还读到,多次使用 realloc 会导致内存碎片。

c malloc realloc

评论

2赞 pmg 7/9/2023
在标准库代码内部,可能会使用编译器本身不可用的实现技巧,使您的实现使用 ,并且(当正确实现时)充其量是性能相同的......而且性能很可能较低。 根据需要完成所有操作。realloc()malloc()memcpy()free()realloc()malloc()memcpy()free()

答:

3赞 Weather Vane 7/9/2023 #1

你使用realloc()

  • 你为什么成功?free(v_old);

  • 您尚未更换program->v

  • realloc()为您复制数据 - 如果重新分配成功,则不得访问旧的指针值。

  • 该函数始终返回 1。

我建议重写这个简单的:

int program_inc_capacity(Program *program)
{
    size_t capacity_new = 2 * program->capacity;
    Instruction *temp = realloc(program->v, capacity_new * sizeof(Instruction));
    if (temp == NULL) {
        printf("Memory reallocation failed!\n");
        return 1;
    }
    program->v = temp;
    program->capacity = capacity_new;
    return 0;
}
3赞 Ted Lyngmo 7/9/2023 #2

是否有任何性能差异?

是的,这可能是一个很大的不同。

  • 使用时,您将被迫将数据从旧内存复制到新内存。malloc
  • 使用时,则可就地增加分配的内存。然后,返回的指针将指向与原始指针相同的地址。然后无需复制任何数据。reallocrealloc

注意:在实现中使用中,您似乎复制了旧数据和旧指针。那不是必需的。 为你做这件事。它不仅不需要:旧的指针被认为是“悬空的”,你不应该取消引用或它所指向的内容。reallocfreereallocfree

3赞 Toby Speight 7/9/2023 #3

是的,可能会有性能差异。

如果能够就地调整大小,则不需要复制内容。这可以减少瞬时内存使用和指令数量。realloc()

即使需要移动,也可以访问您不可用的技术(例如重新映射虚拟内存)以降低其成本。realloc()

但是你的代码被严重破坏了,正如风向标的回答所解释的那样。在开始比较性能之前,您需要使其正确

1赞 Luis Colorado 7/11/2023 #4

是的,有一个(小的)区别:

realloc(3)如果堆上没有空间,只需将内存重新分配到其他位置即可扩展已分配的内存,因此当不需要重新分配时,它的运行速度比 快。malloc(3)

此外,当重新分配到其他位置时,必须将先前分配的块的内容复制到新位置,因此如果您不需要复制原始内容,它将执行额外的工作。