realloc是否保持posix_memalign的内存对齐?

时间:2012-01-31 10:50:13

标签: c linux gcc posix

对齐的mallocposix_memalign,这没关系,但对齐realloc呢? realloc是否保留对齐方式或如何确保重新分配的内存具有相同的对齐方式?假设Linux和x86_64。

3 个答案:

答案 0 :(得分:18)

否,realloc返回的内存posix_memalign无法保证ISO或POSIX保持相同的对齐方式。 realloc 可以简单地在同一地址扩展当前块,但它也可以将块移动到其对齐不如原始地址严格的不同地址。

如果您想要相同的对齐方式,最好分配另一个块并复制数据。

不幸的是,单一UNIX规范中没有posix_memalign_realloc函数。

如果您不想在每个时间轻松复制数据,可以尝试realloc (a),如果对齐那不是预期的,然后然后调用posix_memalign来获取正确对齐的地址并将数据复制到那里,完成时释放旧地址。

这可能导致:

  • 零拷贝(如果当前块可以就地扩展);
  • 一个副本(如果realloc副本,但恰好给你一个正确对齐的块);或
  • 两份副本(如果realloc份,则您还必须因未对齐而复制。)

可能也会导致比指示的复制少,具体取决于底层的内存管理实现。例如,“复制”可能只涉及重新映射内存块而不是物理移动数据。

因此,您可能希望保留一些统计信息,以确定此方案是否值得。


(a)请记住,POSIX和Linux手册页都没有指定你是否可以将这些指针传递给realloc,只有那个你可以将它们传递给free

但是,基于当前的GNU libc源代码,它似乎可行,但不能保证它将来会继续有效: - )

我担心它会正常分配内存(标准对齐)并传回一个偏移地址(即,不是分配的actaul地址,而是N以外的free个字节)free是智能的足以在编织魔法之前回到实际地址。

这样做的一种方法是在返回的地址之前存储实际的地址,但这当然会导致浪费甚至是常规分配。

在这种情况下,posix_memalign可能已经变得聪明(因为规范说它必须能够处理由realloc完成的分配)但free可能没有给出相同的情报(因为文件在这个问题上保持沉默)。

然而,基于GNU glibc 2.14.1,它实际上分配了比需要更多的内存然后摆弄竞技场以释放预空间和后空间,以便返回的地址是“真实”地址,可用realloc或{{1}}。

但是,如上所述,文档并不能保证这一点。

答案 1 :(得分:1)

realloc的行为与malloc相同,因此realloc返回的内存具有与malloc相同的对齐约束。

答案 2 :(得分:0)

如果你看一下realloc的glibc源代码,它会直接调用malloc。所以内存的对齐方式与malloc相同。