提问人:Alessandro 提问时间:7/9/2023 最后编辑:RobAlessandro 更新时间:7/11/2023 访问量:101
使用 malloc 和 realloc 之间有什么性能差异吗?
is there any performance difference between using malloc versus realloc?
问:
我有这个功能:
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 会导致内存碎片。
答:
你使用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;
}
是否有任何性能差异?
是的,这可能是一个很大的不同。
- 使用时,您将被迫将数据从旧内存复制到新内存。
malloc
- 使用时,则可就地增加分配的内存。然后,返回的指针将指向与原始指针相同的地址。然后无需复制任何数据。
realloc
realloc
注意:在实现中使用中,您似乎复制了旧数据和旧指针。那不是必需的。 为你做这件事。它不仅不需要:旧的指针被认为是“悬空的”,你不应该取消引用或它所指向的内容。realloc
free
realloc
free
是的,可能会有性能差异。
如果能够就地调整大小,则不需要复制内容。这可以减少瞬时内存使用和指令数量。realloc()
即使需要移动,也可以访问您不可用的技术(例如重新映射虚拟内存)以降低其成本。realloc()
但是你的代码被严重破坏了,正如风向标的回答所解释的那样。在开始比较性能之前,您需要使其正确。
是的,有一个(小的)区别:
realloc(3)
如果堆上没有空间,只需将内存重新分配到其他位置即可扩展已分配的内存,因此当不需要重新分配时,它的运行速度比 快。malloc(3)
此外,当重新分配到其他位置时,必须将先前分配的块的内容复制到新位置,因此如果您不需要复制原始内容,它将执行额外的工作。
评论
realloc()
malloc()
memcpy()
free()
realloc()
malloc()
memcpy()
free()