对齐的malloc
是posix_memalign
,这没关系,但对齐realloc
呢? realloc
是否保留对齐方式或如何确保重新分配的内存具有相同的对齐方式?假设Linux和x86_64。
答案 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相同。