真的没有支持对齐的 realloc() 版本吗?

Posted

技术标签:

【中文标题】真的没有支持对齐的 realloc() 版本吗?【英文标题】:Is there really no version of realloc() supporting alignment? 【发布时间】:2018-01-12 04:41:40 【问题描述】:

古老的malloc()有几个对齐的版本,例如:

#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);

#include <malloc.h>
void *memalign(size_t alignment, size_t size);

(分别源自 POSIX、glibc 和 Linux libc)。但是 - 我似乎找不到任何提及支持对齐的realloc() 版本。它真的从未实施过吗?将未对齐的realloc() 的功能与在对齐的malloc() 变体中搜索对齐的内存块结合起来似乎很简单。

相关:

Does realloc keep the memory alignment of posix_memalign?

【问题讨论】:

@PeterJ:你是说对齐分配函数比malloc() 保存的信息?我非常怀疑...无论如何,如果您可以进一步充实这一点,最好提供一些讨论的链接,请发布答案。 @PeterJ: 哪个列表呢?... @AndrewHenle:当你在分配器的内部而不是在外部时,这很简单。 @TonyTannous:感谢您的赏金,朋友 :-) @TonyTannous:我刚刚问过this 【参考方案1】:

对齐的 realloc 仅在 Microsoft 中通过 _aligned_realloc 函数实现。 Linux 中没有定义 POSIX 版本,也没有实现。但我一直不明白为什么,因为在glibc 中编写代码似乎并不复杂。 考虑到广泛的 SIMD 指令的出现,我认为有人实施它只是时间问题。

目前,只需分配一个新的对齐内存块,复制内容并释放旧指针。无论如何,这不应该减慢您的应用程序。

【讨论】:

以上是关于真的没有支持对齐的 realloc() 版本吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果失败,realloc 会释放前一个缓冲区吗?

realloc() 失败并返回 NULL 时的正确用法是啥?

realloc() 在嵌入式系统中安全吗?

realloc 调用会引入多少开销?

使用placement new操作符时我真的需要担心对齐吗?

realloc 会覆盖旧内容吗?