【问题标题】:Optimizing realloc function优化 realloc 函数
【发布时间】:2011-10-31 15:28:00
【问题描述】:

我正在编写一个 realloc 函数,目前我的 realloc 处理两种情况(不包括 null 情况)

  1. 如果块旁边有足够的内存,则展开它
  2. 否则分配一个新块并执行 memcpy

我的问题是,我还需要处理其他案件吗?我什么都想不出来。

我想到了一种情况,即前一个块可能是空闲的并向前扩展我之前的块,但这需要一个 memcpy,所以实现它是没有意义的。

【问题讨论】:

  • 这是一个练习(无论是自我强加的还是家庭作业)?任何 stdlib 的 realloc 都应该已经如此。我还没有遇到过没有的。关于这个问题,你已经涵盖了我能想到的所有情况。
  • 考虑“相同大小”的情况 - 不太可能,但要确保没有损坏。

标签: c


【解决方案1】:

包括新尺寸小于旧尺寸的情况;理想情况下,您应该拆分当前块并使其结束。

【讨论】:

  • 是的,这是作业的一部分。感谢您提醒我重新调整大小会减小块大小的情况。我会尝试一下,看看我的内存利用率增加了多少(我的教授对利用率和吞吐量进行了测试)。
【解决方案2】:

搞乱内存分配例程是非常危险的;大多数已经在物理上尽可能优化,而不会影响安全性。您可能进行的任何优化都可能会打开一个可被利用的漏洞 - 目前存在许多“免费后使用”风格的安全问题。

考虑到这一点,哪里比 OpenBSD 源代码更好看:http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c?rev=1.140;content-type=text%2Fx-cvsweb-markup

【讨论】:

    【解决方案3】:

    在某些情况下,realloc 将块大小减少了不小的数量,值得回收以分配到其他地方。

    【讨论】:

      【解决方案4】:

      您可以努力优化realloc 的性能(即避免移动块和memcpy),或者您可以针对内存碎片进行优化。

      如果是后者,您可以考虑移动块以填补最佳间隙,而不是仅仅扩大或缩小它。

      内存分配器总是需要权衡取舍。

      【讨论】:

        猜你喜欢
        • 2012-02-22
        • 2021-02-13
        • 2019-04-21
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多