c - 通过分割一个大的 malloc 内存来减少 malloc 调用

标签 c memory malloc dynamic-allocation

首先,here是我的灵感来源:

There was once an app I wrote that used lots of little blobs of memory, each allocated with malloc(). It worked correctly but was slow. I replaced the many calls to malloc with just one, and then sliced up that large block within my app. It was much much faster.

我在分析我的应用程序时,当我减少 malloc 调用的次数时,性能得到了意想不到的提升。不过,我仍在分配相同数量的内存。

所以,我想做这个人做的事,但我不确定最好的方法是什么。

我的想法:

// static global variables
static void * memoryForStruct1 = malloc(sizeof(Struct1) * 10000);
int struct1Index = 0;
...
// somewhere, I need memory, fast:
Struct1* data = memoryForStruct1[struct1Index++];
...
// done with data:
--struct1Index;

问题:

  • 我必须确保不超过 10000
  • 我必须按照占用的相同顺序释放内存。 (在我的案例中不是主要问题,因为我正在使用递归,但我想尽可能避免它)。

灵感来自 Mihai Maruseac:

首先,我创建了一个 int 链表,基本上告诉我哪些内存索引是空闲的。然后我向我的结构添加了一个名为 int memoryIndex 的属性,它可以帮助我以任何顺序返回占用的内存。幸运的是,我确信我的内存需求在任何给定时间都不会超过 5 MB,因此我可以安全地分配那么多内存。已解决。

最佳答案

给你内存的系统调用是brk。通常的malloccallocrealloc 函数只是使用brk 给定的空间。当该空间不够用时,将创建另一个 brk 以创建新空间。通常,空间会增加一个虚拟内存页的大小。

因此,如果您真的想要一个预制的对象池,那么请确保以页面大小的倍数分配内存。例如,您可以创建一个 4KB 的池。 8KB, ... 空间。

下一个想法,看看你的对象。其中一些具有一种尺寸,一些具有其他尺寸。从同一个池中处理所有这些分配将是一个很大的痛苦。为各种大小的对象创建池(最好是 2 的幂)并从中分配。例如,如果您有一个大小为 34B 的对象,您将从 64B 池中为其分配空间。

最后,剩余空间可以不使用,也可以向下移动到其他池。在上面的示例中,您还剩下 30B。您将其拆分为 16B8B4B2B block ,并将每个 block 添加到各自的池中.

因此,您可以使用链表来管理预分配空间。这意味着您的应用程序将使用比实际需要更多的内存,但如果这真的对您有帮助,为什么不呢?

基本上,我所描述的是 buddy allocator 之间的混合和 slab allocator来自 Linux 内核。

编辑:阅读您的评论后,使用malloc(BIG_SPACE) 分配一个大区域并将其用作您的内存池将非常容易。

关于c - 通过分割一个大的 malloc 内存来减少 malloc 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12584480/

相关文章:

c - 什么时候在预处理中删除换行符?

更改 ASCII 字符 - 类型无效?

.net - 分配内存的 View

c - Linux 和 Windows 上的 malloc_size 替代方案

使用calloc后C访问冲突

c - 输入返回正确的字符串但不运行函数

c - 外部数组,如何使用

C 数字母函数

java - Java 应用程序运行时出现“无法分配内存”(errno=12) 错误

java - 在任务管理器和探查器中监视java应用程序内存,哪个是正确的?