c语言 - 通过切一个大的恶意内存来减少恶意调用



首先,我是从这里得到这个想法的:

我曾经写过一个应用程序,它使用了很多内存,每个内存都用malloc()分配。它工作正常,但缓慢的我用一个替换了对malloc的许多调用,然后在我的应用程序中分割了那个大块。速度要快得多。

我正在分析我的应用程序,当我减少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;

Gotchas:

  • 我必须确保我不超过10000
  • 我必须按照我占用的顺序释放内存。(在我的情况下,这不是一个大问题,因为我使用递归,但如果可能的话,我希望避免它)

灵感来自Mihai Maruseac:

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

为您提供内存的系统调用是brk。通常的malloccallocrealloc函数只是使用brk给出的空间。当该空间不够时,制作另一个brk来创建新的空间。通常,虚拟内存页面的大小会增加空间。

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

下一个想法是,看看你的物品。它们中的一些有一个尺寸,一些有另一个尺寸。从同一个池中处理所有这些池的分配将是一件非常痛苦的事情。为各种大小的对象创建池(最好是2的幂)并从中进行分配。例如,如果您有一个大小为34B的对象,您可以从64B池中为其分配空间。

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

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

基本上,我所描述的是Linux内核中的buddy分配器和slab分配器的混合。

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

如果可以的话,可以考虑使用glib,它具有支持此功能的内存切片API。它使用起来非常简单,而且不用重新实现

相关内容

  • 没有找到相关文章

最新更新