【发布时间】:2014-02-21 22:59:05
【问题描述】:
例如,如果动态内存的释放总是以与分配相反的方向进行。那样的话,能保证heap不会碎片化吗?
从理论的角度来看:对于非平凡的应用程序是否存在一些现实的方法来管理内存以完全避免堆碎片? (堆中每次原子变化后,堆是否仍然没有碎片化?)
【问题讨论】:
-
对于您的第一种情况,标准当然不能保证。但是,如果分配模式如此简单,您可以轻松地自己制作一个高性能的。第二种情况显然是一个困难得多的问题。就我个人而言,我只是(成功地)在特定于应用程序的级别上完成了它。这并不是一件小事,因为它需要有足够的关于未来分配的信息才能知道将当前分配放在哪里。
-
听起来您的分配满足堆栈规则,因此用作堆栈的大块连续内存应该没有碎片并满足您的分配需求。
-
@HansPassant 64 位(或者更确切地说是 48 位)地址空间非常好,但仍以页面粒度进行管理,即您仍然可以通过单个杂散分配阻止 4 KiB 的物理内存,无论多小.虚拟机空间并不是一切。这并不是说许多程序需要担心碎片化(它们不需要,而且不会比我们拥有商品 64 位的时间更长)。
-
另一个可能相关的话题(出于对微优化的关注)是allocators and pre-allocated object pools的用法
-
@MartinJames:目前还不清楚该评论应该如何融入本次讨论。请详细说明。
标签: c++ memory-management