【发布时间】:2011-05-11 22:00:18
【问题描述】:
您好,我正在考虑通过尝试一些我以前从未做过的事情来扩展我的技能。一直让我有点困惑的一件事是内存分配器和内存池。我想要做的是占用一块内存,并且只从系统分配一次内存。我目前已经设置好了,内存是一个字节(或字符)数组,用于我的测试目的是 65535。
我考虑过使用两种算法。
首先是一种算法,其中整个数据块都附加了剩余的内存量,以及指向第一个分配块(或块头)的指针(或者更确切地说是偏移量),然后每次分配都是前面是分配的大小,以及上一个和下一个分配,所以我可以轻松释放分配。然后,我可以通过查看当前分配后的空间来生成最大和最小的块。
我的另一个选择是在分配的内存之前添加第二个偏移量并将其指向第一个未分配的块,然后每个未分配的块也具有上一个和下一个分配,以及一个大小,以便我可以轻松找到可以放置我下次分配的地方。
问题是我不知道哪个是“正确的”。假设我们将有可变大小的分配(但大多数分配的大小不会有太多开销。)第一个获得最大和最小可能块的速度会较慢,但我可以存储它们并在必要时对其进行操作以避免再生它们。然而,第二个将花费更长的时间来解除分配(由于必须找到哪个解除分配器与哪个分配器相邻)并且不一定会给分配带来任何好处。事实上,如果剩余的字节数少于 6 个字节(大小为 2 个字节,上一个偏移量为 2 个,下一个偏移量为 2 个),则需要更专门的代码。
我的直觉告诉我,第一个要好得多,但第二个的某些东西很诱人。有什么意见吗?还是有更简单的解决方案?
【问题讨论】:
-
如果速度与内部碎片有关,单元分配方案通常是最快的。恒定时间分配和释放。无需加入内存块。基本上分配一堆大小相同的块,将它们放在堆栈上并在分配时将它们弹出。完成后推回。
标签: c++ algorithm memory-management