C++ 内存池/内存分配器的正确布局?(哪种算法)

C++ 内存池/内存分配器的正确布局?(哪种算法),c++,algorithm,memory-management,C++,Algorithm,Memory Management,你好,我想尝试一些我以前从未做过的事情来扩展我的技能。有一件事总是让我有点迷惑,那就是内存分配器和内存池。我想做的是获取一块内存,只从系统中分配一次内存。我目前已经设置好了,内存是一个字节(或字符)数组,用于我的测试目的是65535 我考虑过使用两种算法 首先是一种算法,在该算法中,整个数据块都附加了剩余的内存量,以及指向第一个分配块(或块头)的指针(更确切地说是偏移量),然后每个分配之前都有分配的大小,以及上一次和下一次分配,因此我可以轻松地释放分配。然后,通过查看当前分配后的空间,我可以生成

你好,我想尝试一些我以前从未做过的事情来扩展我的技能。有一件事总是让我有点迷惑,那就是内存分配器和内存池。我想做的是获取一块内存,只从系统中分配一次内存。我目前已经设置好了,内存是一个字节(或字符)数组,用于我的测试目的是65535

我考虑过使用两种算法

首先是一种算法,在该算法中,整个数据块都附加了剩余的内存量,以及指向第一个分配块(或块头)的指针(更确切地说是偏移量),然后每个分配之前都有分配的大小,以及上一次和下一次分配,因此我可以轻松地释放分配。然后,通过查看当前分配后的空间,我可以生成最大和最小的块

我的另一个选择是在分配的内存之前添加第二个偏移量,并将该点指向第一个未分配的块,然后每个未分配的块还具有上一个和下一个分配,以及一个大小,以便我可以轻松找到下一个分配可以放置的位置

问题是我不知道哪个是“合适的”。假设我们将有可变大小的分配(但大多数分配的大小不会有太大的开销)。第一个分配会更慢,以获得最大和最小的可能块,但我可以存储这些分配,并在必要时对其进行操作,以避免重新生成它们。然而,第二种方法需要更长的时间来解除分配(因为必须找到哪个deallocator紧挨着哪个分配器),并且不一定会给分配带来任何好处。事实上,如果剩余的字节少于6个(2个字节表示大小,2个字节表示上一个偏移量,2个字节表示下一个偏移量),则需要更专门的代码


我的直觉告诉我,第一种方法要高得多,但第二种方法有些诱人。有什么意见吗?或者有更简单的解决方案吗?

这种方法的问题是处理碎片(以及如何合并相邻的空闲内存块)。看看这个问题:,讨论了另一种方法…

如果速度与内部碎片有关,那么单元分配方案通常是最快的。恒定时间分配和自由。不需要加入内存块。基本上,分配一堆大小相同的块,将它们放在堆栈上,然后按分配的块弹出。完成后推回。