当最小分配对齐为 16 字节时,如何进行 24 字节大小的分配?

Leo*_*llo 1 c c++ malloc memory-management jemalloc

我的应用程序进行了大量恰好 24 字节的分配,但我使用的是第三方库,该库要求分配器提供至少 16 字节的对齐。

因此,如果我编译jemalloc配置为 8--with-lg-quantum=3字节对齐 ( ),我会得到 24 字节的分配,但我的第三方库失败。

如果我编译jemalloc配置为 16字节对齐 ( --with-lg-quantum=4),我的malloc((size_t)24)调用将分配 32 个字节。这增加了 33.3% 的内存使用量。但是,我需要定期malloc((size_t)24)调用来分配 16 字节对齐(因此是 32 字节),以便我的第三方库工作。

如何从我的应用程序分配 24 字节块(8 字节对齐)以有效地使用内存?

我试过了aligned_alloc(8, 24),但它仍然分配 32 字节,16 字节对齐。

Nic*_*las 8

如果你赚了很多正好是24个字节分配的,而那些分配的内存效率是一个问题,你不应该使用malloc直接可言。您应该使用大小为 24 字节的池分配器。

池分配器从堆中分配一大块内存,然后将其划分为您指定大小的固定大小的块。这样,您不仅可以避免对齐开销,还可以避免堆用于跟踪空闲数据块的信息开销。您还可以帮助避免由如此微小的分配造成的碎片。释放这些分配非常快(就像制作它们一样)。等等。

使用池分配器,您应该能够准确分配您需要的内容,而不会干扰您正在使用的库。您可以为 10,000 个 24 字节块分配一块内存,唯一的开销将是跟踪空闲块所需的簿记(如果您很聪明,它们主要可以使用空闲块本身)。