posix_memalign()需要多少额外的内存?

3

我正在决定是否应该使用memalign()而不是malloc(),因为对齐的内存会使我的工作更容易。我阅读了GNU文档http://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html ,其中提到函数memalign通过分配一个略大的块来工作。我想知道那个“略大的块”的确切值。

逻辑上,所需的额外内存应该等于所需的对齐值。但我不确定是否有优化。


1
你可以编写一个简单的程序来泄漏内存,然后在valgrind下运行它(或者查看这些调用是否适用于mtrace)。 - Useless
@Useless:我尝试了以下代码:void *m; posix_memalign(&m, 512, 1024); 但valigrind显示丢失了1024。我也尝试过不同的对齐方式,如8、16、32以及不同的内存大小如512、1024等,但结果都相同。这是否意味着不需要额外的内存? - aakash
@Useless:DrewDormann 刚刚确认了它。 - aakash
1个回答

4

Posix是一个标准,而不是特定的代码集,但我们可以参考libc作为示例。

这里是posix_memalign()在该实现中最初分配的内容。

mem = malloc (size + 2 * alignment);

通过这个精美的ASCII插图。

    /*
      ______________________ TOTAL _________________________
     /                                                      \
    +---------------+-------------------------+--------------+
    |               |                         |              |
    +---------------+-------------------------+--------------+
    \____ INIT ____/ \______ RETURNED _______/ \____ END ___/

   */

然后,它会将分配的两端未使用的存储空间返回到堆中。

这意味着碎片可能会变得更糟,但使用的堆内存量相同


为什么是2 *对齐?1 *对齐不足以满足吗? - aakash
它必须在末尾分配一些额外的字节(我认为)。 - Zyx 2000
@DrewDormann:你的意思是说,如果我需要512字节,那么只有512字节会从堆中取出,副作用就是内存碎片化? - aakash
1
@aakash 内存碎片化可能会不同,并且可能更糟。其他方面是正确的。 - Drew Dormann
https://elixir.bootlin.com/musl/latest/source/src/malloc/posix_memalign.c https://elixir.bootlin.com/musl/latest/source/src/malloc/mallocng/aligned_alloc.c#L5 1*对齐应该是正确的。 - Caster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接