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

Car*_*s00 17 c linux gcc posix

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

pax*_*blo 20

否,realloc返回的内存posix_memalign不能保证ISO或POSIX保持相同的对齐.A realloc 可以简单地将当前块扩展到相同的地址,但是它也可以将块移动到不同的地址,该地址的对齐不如原始地址严格.

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

遗憾的是,posix_memalign_realloc单一UNIX规范中没有任何功能.

如果你不想每次都经历复制数据的麻烦,你可以尝试realloc (a),如果它的对齐不符合预期,那么只有调用posix_memalign才能得到一个正确对齐的地址并复制数据到那里,完成时释放旧地址.

这可能导致:

  • 零拷贝(如果当前块可以就地扩展);
  • 一个副本(如果是realloc副本但恰好给你一个正确对齐的块); 要么
  • 两份(如果是realloc副本,那么你也必须因未对准而复制).

根据底层的内存管理实现,它还可能导致比指示的复制少.例如,"复制"可能仅涉及重新映射存储块而不是物理地移动数据.

因此,您可能需要保留一些统计信息,以确定此方案是否值得.


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

但是,根据当前的GNU libc源代码,它似乎可以工作,虽然不能保证它将来会继续工作:-)

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

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

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

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

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