假设我有一个内存池对象,它的构造函数需要一个指向大块内存ptr和大小N的指针。如果我进行多个随机大小的分配和释放操作,可能会使内存达到这样一种状态:即使有很多空闲内存,我也无法连续地在内存中分配M字节的对象!同时,我也不能压缩内存,因为那会导致使用者的指针失效。在这种情况下,如何解决内存碎片问题?
了解您实际尝试做什么会很有帮助,因为有许多处理此问题的方法。
但是,第一个问题是:这是否真的发生了,还是理论上的担忧?
需要记住的一件事是,通常可用的虚拟内存地址空间比物理内存要多得多,因此即使物理内存是分段的,仍然有大量连续的虚拟内存。(当然,在下面的物理内存是不连续的,但您的代码看不到。)
我认为有时对内存碎片化存在不必要的恐惧,因此人们编写自定义内存分配器(或更糟糕的是,他们构思具有句柄和可移动内存以及压缩的方案)。我认为这些在实践中很少需要,并且有时放弃这些并回到使用malloc可以提高性能。