解决方法
如果您想要相同的对齐方式,最好分配另一个块并复制数据.
不幸的是,在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的.
但是,如上所述,文档不能保证.