【问题标题】:C re-alloc/malloc alternativeC re-alloc/malloc 替代
【发布时间】:2012-10-30 19:25:00
【问题描述】:

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

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

我正在使用 Linux。这可能有什么特殊功能吗?

谢谢! :)

【问题讨论】:

标签: c malloc realloc


【解决方案1】:

如果你不关心内容,标准的成语是free 后跟malloc。找到一个块比复制它便宜,并且不能保证realloc 不会自己进行一些搜索。

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

【讨论】:

  • 我能想到 realloc 在这种情况下会获胜的唯一原因是缓存温暖(即使您只打算在内存上写入,这在现代系统上也很有用)。跨度>
  • @Ben:如果缓存温暖在任何给定平台上都是如此巨大的喇叭交易,那么您希望内存分配器尽可能返回最近释放的块。所以 free-then-malloc 将在与 realloc 大致相同的条件下返回相同的块,尽管它可能需要做更多的思考才能做出这个决定。
  • @SteveJessop 我也是这么想的,但经过反思,我不确定是否有理由期望新的分配只重用最近释放的块(如果合适的话)。那基本上是first-fit allocation,它有自己的问题。 Production-strength allocators 通常会部署混合策略,他们可能会返回第一个区块或寻找更合适的区块,具体取决于各种因素,例如请求大小和竞技场碎片。
  • @user4815162342:同意。我们跳过了很多细节,例如我假设新请求的内存比刚刚释放的块的分配大小更多,但小于刚刚释放的块的底层大小(即调用者的情况必须重新分配,但realloc 只能返回相同的地址)。那么我认为分配器使用该块可能是一个合理的策略。如果新请求是针对更小的尺寸,那么是的,它必须考虑其他事情。
【解决方案2】:

realloc = Alloc 然后复制然后释放 另一种解决方案是 alloc 并且 free 肯定更快

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如果我 free() 然后 malloc() -- 我是否从用户空间切换到内核空间 2 次?还是编译器在这里进行了某种优化?
    • 我不确定编译器是否会像这样优化两个单独的函数调用。然而,realloc 实现几乎肯定会有有效处理您的场景的逻辑。
    • 但问题是,对于 realloc 来说正确的事情对 OP 来说不是正确的事情。 OP 不关心内存的内容,而 realloc 旨在仔细保留内容。在这种情况下,信任分配器做正确的事情意味着调用 free 和 malloc。
    • 调用free时通常会有no系统调用。在调用malloc 时,有两种情况会进行系统调用:库处理的堆太小,而库通过sbrk 调用要求更多,或者分配开始时很大,然后库将直接调用memmap。在大多数情况下,“malloc”不会是系统调用。
    猜你喜欢
    • 1970-01-01
    • 2013-01-25
    • 2015-12-17
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多