代码之家  ›  专栏  ›  技术社区  ›  Clark Gaebel

C++中的堆行为

  •  0
  • Clark Gaebel  · 技术社区  · 16 年前

    重载全局运算符new以将所有分配归集到下一个二次幂的优化有什么问题吗?从理论上讲,这将以更高的最坏情况下的内存消耗为代价来降低碎片,但是操作系统是否已经有了这种技术的冗余行为,或者它是否尽了最大努力来节省内存?

    基本上,考虑到内存使用和性能的关系不大,我应该这样做吗?

    4 回复  |  直到 16 年前
        1
  •  6
  •   anon anon    16 年前

    char * p = new char[3];
    

    分配器几乎肯定会执行以下操作:

    char * p = new char[16];   // or some minimum power of 2 block size
    

    除非您能够证明您在分配方面存在实际问题,否则您不应该考虑编写自己的new版本。

        2
  •  4
  •   fredoverflow    16 年前

        3
  •  3
  •   Alienfluid    16 年前

    你应该这样做吗?不。

    • 重载全局new操作符将不可避免地给您带来痛苦,特别是当外部库依赖于股票版本时。
    • 堆的现代操作系统实现已经考虑到了碎片。如果你在窗户上,你可以看看 Low Fragmentation Heap “如果你有特殊需要。

        4
  •  0
  •   Patrick    16 年前

    我同意Neil、Alienfluid和Fredriffolf的观点,在大多数情况下,您不想编写自己的内存分配器,但我仍然编写了自己的内存分配器大约15年,并经过多年的改进(第一个版本使用malloc/free重定义,后来的版本使用global new/delete操作符),以我的经验,好处是巨大的:

    • 为了找到与内存相关的错误,您可以很容易地将日志添加到内存分配器中,甚至进一步细化它(例如,记录大小为N字节的内存的所有新闻和删除)
    • 在内存分配中添加一个红色区域(在分配的内存前加一个校验和,在分配的内存后加一个校验和)可以很容易地更快地找到缓冲区溢出/下溢