C11aligned_alloc分配的内存重新分配是不是保持对齐?

Posted

技术标签:

【中文标题】C11aligned_alloc分配的内存重新分配是不是保持对齐?【英文标题】:Does realloc of memory allocated by C11 aligned_alloc keep the alignment?C11aligned_alloc分配的内存重新分配是否保持对齐? 【发布时间】:2013-12-17 08:27:58 【问题描述】:

考虑以下 (C11) 代码:

void *ptr = aligned_alloc(4096, 4096);
... // do something with 'ptr'
ptr = realloc(ptr, 6000);

由于ptr 指向的内存具有来自aligned_alloc 的4096 字节对齐,在(成功)调用realloc 之后它会(阅读:是否保证)保持该对齐?或者内存可以恢复到默认对齐方式吗?

【问题讨论】:

标准承诺没有这样的事情。 标准中没有规定realloc() 应记住原始指针的对齐要求,因此标准不要求保留对齐要求。 posix_memalign 相同:***.com/questions/9078259/… 【参考方案1】:

对齐不与指针保持一致。当您调用 realloc 时,您只能依赖 realloc 保证的对齐方式。您需要使用aligned_alloc 来执行任何重新分配。

【讨论】:

形式上,reallocmalloc+memcpy+free 没有区别。 @R.. realloc 允许将其优化为增长或收缩,从而避免 memcpy 是的,但这是一种不违反形式等价的优化。为了推理与对齐相关的所需行为,最好将所有事情都按照 C 标准定义的抽象机器中的情况进行思考,而不是根据您期望发生的优化来进行思考。 @R..:这是不同的。您所描述的是最坏情况下会发生什么;你绝对不能假设最坏的情况总是会发生。即使在抽象机器中,这也不会总是发生。

以上是关于C11aligned_alloc分配的内存重新分配是不是保持对齐?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 分配器中没有重新分配功能?

重新分配内存并在C中重新分配的内存空间添加一个字符串

堆缓冲区溢出试图重新分配内存。 C语言

C++11 中的动态对齐内存分配

多个指向C中重新分配的内存块的指针

如何在 C++ 中为 char *array 安全地重新分配内存(用于 CustomString 类)