我的应用程序分配了很多准确的24字节,但是我使用的是第三方库,该库要求分配器提供至少16字节的对齐方式。
因此,如果我编译配置为8字节对齐(jemalloc
)的--with-lg-quantum=3
,则会获得24字节的分配,但我的第三方库将失败。
如果编译为16字节对齐(jemalloc
)配置的--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字节对齐。
如果您要分配大量恰好为24个字节的分配,而这些分配的内存效率是一个问题,则不应直接使用malloc
完全。您应该使用大小为24字节的池分配器。
池分配器从堆中分配很大的内存,然后将其分成指定大小的固定大小的块。这样,您不仅可以避免对齐开销,而且还可以避免堆用于跟踪可用数据块的信息的开销。您还可以帮助避免因如此微小的分配而导致的碎片化。释放这些分配的速度非常快(正在分配它们)。依此类推。
使用池分配器,您应该能够准确分配所需的资源,而不会干扰正在使用的库。您可以为10,000个24字节块分配一块内存,而唯一的开销将是跟踪哪些块是空闲的,哪些块不是空闲的所需的10,000位。