C++ 编写内存管理器并对内存进行碎片整理
这个想法是编写一个内存管理器,一次分配一堆内存,以最小化malloc和空闲调用。我自己写过两次,但都遇到了内存碎片整理的问题 您可以每隔一段时间检查一个块是否为空,如果为空则删除它。但假设每个块有100个字节,首先分配20个字节的内存,这将创建一个新的100字节块,因为还不存在块,然后分配80个字节,这将填充第一个块,然后再分配20个字节,这将创建另一个新块,因为第一个块已满,然后释放第二个分配(80字节),剩下两个块,其中只使用前20个字节,这意味着您已分配100个字节,可以通过将第二个块中的20个字节移动到第一个块并删除第二个块来释放这些字节 以下是我遇到的问题:C++ 编写内存管理器并对内存进行碎片整理,c++,memory-management,C++,Memory Management,这个想法是编写一个内存管理器,一次分配一堆内存,以最小化malloc和空闲调用。我自己写过两次,但都遇到了内存碎片整理的问题 您可以每隔一段时间检查一个块是否为空,如果为空则删除它。但假设每个块有100个字节,首先分配20个字节的内存,这将创建一个新的100字节块,因为还不存在块,然后分配80个字节,这将填充第一个块,然后再分配20个字节,这将创建另一个新块,因为第一个块已满,然后释放第二个分配(80字节),剩下两个块,其中只使用前20个字节,这意味着您已分配100个字节,可以通过将第二个块中的
大多数内存管理器都提供了一系列大小,这样大的分配就不会被分割到n个较小的块中。大多数都会向系统分配器投入非常大的分配,在虚拟内存操作系统上,系统分配器通常可以解决问题,除非进程地址空间过于分散。看看buddy systems-您是否有需要解决的实际性能问题?如果不是,那么我会说这是过早的优化。大多数常用的malloc/free实现都是由对问题领域有深入了解的有才华和经验的程序员编写的,然后根据实际使用中发现的任何缺陷,经过一段时间的改进。这并不意味着它们是最好的实现,但它表明您不太可能在第一次尝试时做得更好。虽然问题有点不同,但我认为您可能会发现这个答案很有用:JesperJuhl因为我编写代码是为了好玩,所以我所做的一切都是不成熟的,因为我可能永远不会在实践中使用它。NeilButterworth我不知道这是如何解决碎片问题的,分配3个块并删除第二个块仍然会留下未使用的内存。rici当两个进程同时调用malloc时,一个进程需要等待另一个进程完成,为单线程应用程序编写自己的管理器可能会更快,我不确定,因为我还没有编写一个。