c++ - 是否有可能实现一个与数组而不是单个对象一起工作的内存池?

标签 c++ arrays memory memory-management

我知道为单个对象创建一个内存池很容易,但是我需要为数组创建一个内存池。我目前拥有的内存池有一个指向连续内存块的地址 vector 和一个指向这些 block 中每个对象的堆栈,因此当您从池中分配时,您只需弹出堆栈,而当您释放时,您只需推送一个对象的地址回到它。但是我还需要一个等效的数组。像这样:

template<typename T>
class ArrayPool
{
public:
ArrayPool();
~ArrayPool();

T* AllocateArray(int x); //Returns a pointer to a T array that contains 'x' elements.
void FreeArray(T* arr, int x); //Returns the array to the free address list/stack/whatever/
};

这样的事情实现了吗?我想象拥有这样一个池的一个大问题 - 如果确保 ALLocateArray 返回的数组在内存中是连续的,我基本上就像没有内存池一样做同样的事情。只需当场分配数组。使用普通对象池,每次我只分配 1 个对象。对于数组,我可能每次都分配一个不同大小的数组,所以一旦一个数组被释放,它就不会与一个新的不同大小的数组兼容,除非我将数组与一些类似链表的结构结合在一起,但后来他们赢了不要连续。

最佳答案

目前,您的分配器利用了所有分配大小相同的事实。这简化并加速了分配和释放,意味着不可能出现内存碎片。

如果您必须分配任意大小的数组,那么您需要的是通用分配器,而不是池分配器。接下来做什么取决于您首先使用池分配器的原因。我可以想到池分配器的另外两个可能相关的功能,并且可能还有其他功能:

  • 所有内存都来自创建池时指定的特定区域
  • 可以通过重置池立即释放所有内存,而无需释放每个单独的分配。

如果您不需要自己控制分配的任何特殊功能,那么只需使用 vector 或全局 operator newmalloc 来分配您的内存。如果您确实需要特殊功能,那么您可能希望使用现成的分配器而不是实现您自己的分配器。如果你真的想深入了解一个好的内存分配器如何工作的细节,那么看看 http://g.oswego.edu/dl/html/malloc.html并可能根据您的使用进行调整。

但是如果你真的需要为了有限的目的手动分配一个分配器,那么基本的想法是,你需要一些数据结构(你的选择),而不是一个你总是可以从中获取第一个的空闲节点列表包含不同大小的空闲 block ,这使您可以快速找到足够大的 block 来满足当前请求。在它更大的情况下,您可能会选择拆分块,返回其中的一部分,并将其余部分保留为一个新的较小的空闲 block 。在两个空闲 block 相邻的情况下,您可以选择将它们合并为一个更大的空闲 block 。

一个常见的策略是保留特定大小(例如 16、32、64...)的类似池的 block 列表。如果请求足够小,请使用其中之一来满足它。如果没有,做一些更复杂的事情。但正如我所说,如果你想看到很多技巧一起工作,那么看看 dlmalloc。

关于c++ - 是否有可能实现一个与数组而不是单个对象一起工作的内存池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22042770/

相关文章:

python - 永远保持文件打开的风险

swift - 为什么内存地址不会因不同的结构实例而改变?

c++ - 使用带有模板基类的类作为基类参数

c++ - 在 C++ 中获取特定的窗口名称

c - 部分排序数组 C

javascript - 如何在对象数组中找到下一个将某个属性设置为 false 的对象?

c++ - 将大 vector 存储在堆栈中是个坏主意吗?

c++ - 完全限制对文件夹的所有类型的访问

java - 在 Android 中构建一个简单的数组

memory - 内存对齐的目的