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

前端之家收集整理的这篇文章主要介绍了realloc是否保持posix_memalign的内存对齐方式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对齐的malloc是posix_memalign,没关系,但是对齐的realloc呢? realloc是否保留对齐方式或如何确保重新分配的内存具有相同的对齐方式?假设 Linux和x86_64.

解决方法

否,从posix_memalign返回的内存中的realloc不能由ISO或POSIX保证以保持相同的对齐方式. realloc可以简单地在同一地址扩展当前块,但是它也可以将块移动到不同于原始块的对齐方式的不同地址.

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

不幸的是,在UNIX UNIX规范中也没有posix_memalign_realloc函数.

如果您不想每次复制数据的麻烦,您可以尝试realloc(a),如果该对齐方式不如预期的那样,则只能调用posix_memalign来获取正确对齐的地址,将数据复制到那里,完成后释放旧地址.

这可能导致:

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

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

所以你可能想保留一些统计数据,看看这个方案是否值得.

(a)请记住,POSIX和Linux手册页都不指定是否可以将这些指针传递给realloc,只有您可以将它们传递给自由.

然而,根据目前的GNU libc源代码,它似乎工作,虽然这不能保证将来会继续工作:-)

我的恐惧是,它将正常地分配内存(标准对齐)并传回一个偏移地址(即,不是分配的动作地址,但是除了一个N字节之外),这是免费的智能足以在编织之前转回实际地址魔法.

这样做的一种方法是将实际地址存储在返回地址之前,当然这也会导致浪费,即使是定期分配.

在这种情况下,自由可能已经变得聪明(因为规范说它必须能够处理由posix_memalign完成的分配),但是realloc可能没有被赋予相同的智能(因为文档对此没有保密).

然而,基于GNU glibc 2.14.1,它实际上分配了比所需要的更多的内存,然后与竞技场一起腾出空间和后期空间,以便返回的地址是一个“真实的”地址,可以免费使用realloc的.

但是,如上所述,文档不能保证.

原文链接:https://www.f2er.com/c/115220.html

猜你在找的C&C++相关文章