C re alloc/malloc替代方案

C re alloc/malloc替代方案,c,malloc,realloc,C,Malloc,Realloc,我有一块内存,我想重新分配到不同的大小,但我不在乎内存是否被丢弃。释放()内存然后malloc()一个新内存块会更快吗,还是realloc()会更快 我认为这两种解决方案都不是最优的,因为需要执行额外的工作。我打赌realloc()能够更快地定位足够大的内存块,因为当前片段可能足够大或足够小,可以容纳新的内存块。但是,如果片段不够大,它必须复制malloc()没有的内存 我正在使用Linux。这可能有一个特殊的功能吗 谢谢!:) 如果你不在乎内容,标准的习惯用法是做free,然后是malloc。

我有一块内存,我想重新分配到不同的大小,但我不在乎内存是否被丢弃。释放()内存然后malloc()一个新内存块会更快吗,还是realloc()会更快

我认为这两种解决方案都不是最优的,因为需要执行额外的工作。我打赌realloc()能够更快地定位足够大的内存块,因为当前片段可能足够大或足够小,可以容纳新的内存块。但是,如果片段不够大,它必须复制malloc()没有的内存

我正在使用Linux。这可能有一个特殊的功能吗


谢谢!:)

如果你不在乎内容,标准的习惯用法是做
free
,然后是
malloc
。查找块比复制块便宜,而且不能保证
realloc
本身不会进行一些搜索


在这种情况下,如果您真的关心性能,最好在目标平台和实际工作负载下对这两种解决方案进行基准测试,看看哪一种性能更好。

我会继续,相信realloc实现会做正确的事情。此外,在将来,您不应该担心内存是否被移动、重新分配等。这种先发制人的优化是不必要的,因为大部分时间都花在从用户空间到内核空间的上下文切换上

realloc=Alloc然后复制然后释放
另一种解决方案是alloc,free only当然更快,请看答案,您也可以看一下:您是这个问题的特例,
header\u size
为0。如果我free()然后malloc()--我是否从用户空间切换到内核空间两次?或者编译器在这里执行某种优化?我不确定编译器会优化掉两个单独的函数调用。然而,realloc实现几乎肯定会有有效处理您的场景的逻辑。但问题是,realloc的正确操作不是OP的正确操作。OP不关心内存的内容,realloc的设计是为了小心地保存内容。在这种情况下,信任分配器做正确的事情意味着调用free和malloc。通常在调用
free
时没有系统调用。在调用
malloc
时,有两种情况下会进行系统调用:库处理的堆太小,lib通过
sbrk
调用要求更多,或者分配太大,然后lib将直接调用
memmap
。在大多数情况下,“malloc”不会是系统调用。我能想到的唯一原因是,
realloc
在这种情况下会是一个胜利的原因是缓存温暖(在现代系统中,即使你只打算在内存上写,它也很有用)。@Ben:如果缓存温暖在任何给定平台上都是一个巨大的交易,您希望内存分配器尽可能返回最近释放的块。所以free-then-malloc将在与realloc大致相同的条件下返回相同的块,尽管它可能需要做更多的思考才能做出决定。@SteveJessop我也这么想,但经过思考,我不确定期望一个新的分配在合适的情况下只重用最近释放的块是否合理。这基本上是一个有自己问题的国家。通常部署一种混合策略,根据各种因素,例如请求大小和竞技场碎片,他们可能返回第一个区块或搜索更合适的区块。@user4815162342:同意。我们跳过了很多细节,例如,我假设新请求的内存大于刚刚释放的块的分配大小,但小于刚刚释放的块的基本大小(即调用方必须重新分配,但
realloc
可能只返回相同的地址)。那么我认为分配器使用该块可能是一种合理的策略。如果新的请求是一个较小的尺寸,那么是的,它将不得不考虑其他事情。