gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:23:56 24 4
gpt4 key购买 nike

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

最佳答案

不,ISO 或 POSIX 不保证从 posix_memalign 返回的内存上的 realloc 保持相同的对齐。 realloc 可能只是在同一地址扩展当前 block ,但它也可能将 block 移动到对齐不如原始地址严格的不同地址。

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

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

如果您不想经历每次 复制数据的麻烦,您可以尝试realloc (a) 和,如果它的对齐方式不符合预期,然后并且仅然后调用 posix_memalign 以获得正确对齐的地址并将数据复制到那里,释放旧地址时完成。

这可能导致:

  • 零副本(如果当前 block 可以就地扩展);
  • 一个副本(如果 realloc 复制但恰好给你一个正确对齐的 block );或
  • 两个副本(如果 realloc 副本,然后由于未对齐,您还必须复制)。

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

因此您可能需要保留一些统计数据以查看此方案是否值得。


(a) 请记住,POSIX 和 Linux 手册页均未指定您是否可以将这些指针传递给 realloc ,只是您可以将它们传递给 free

然而,基于当前的 GNU libc 源代码,它似乎可以工作,尽管这不能保证它在未来会继续工作:-)

我担心它会正常分配内存(标准对齐)并传回偏移地址(即,不是实际分配的地址,而是超出该地址的 N 个字节),这 free 足够聪明,可以在编织魔法之前返回到实际地址。

这样做的一种方法是在返回地址之前立即存储实际地址,尽管这当然会导致浪费,即使对于常规分配也是如此。

在那种情况下,free 可能已经变得智能(因为规范说它必须能够处理由 posix_memalign 完成的分配)但是 realloc 可能没有得到相同的情报(因为文档对此事保持沉默)。

然而,基于 GNU glibc 2.14.1,它实际上分配了比需要更多的内存,然后摆弄 arena 以释放前空间和后空间,以便返回的地址是“真实”地址,可用通过 freerealloc

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

关于c - realloc 是否保持 posix_memalign 的内存对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9078259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com