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

问题描述 投票:0回答:1

我的应用程序分配了很多准确的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字节对齐。

c++ c memory-management malloc jemalloc
1个回答
2
投票

如果您要分配大量恰好为24个字节的分配,而这些分配的内存效率是一个问题,则不应直接使用malloc 完全。您应该使用大小为24字节的池分配器。

池分配器从堆中分配很大的内存,然后将其分成指定大小的固定大小的块。这样,您不仅可以避免对齐开销,而且还可以避免堆用于跟踪可用数据块的信息的开销。您还可以帮助避免因如此微小的分配而导致的碎片化。释放这些分配的速度非常快(正在分配它们)。依此类推。

使用池分配器,您应该能够准确分配所需的资源,而不会干扰正在使用的库。您可以为10,000个24字节块分配一块内存,而唯一的开销将是跟踪哪些块是空闲的,哪些块不是空闲的所需的10,000位。

© www.soinside.com 2019 - 2024. All rights reserved.