【发布时间】:2021-03-01 05:30:07
【问题描述】:
是否有相当于_aligned_realloc 的linux 版本?
我想使用 realloc,这样我就不必每次调整数据大小时都对其进行 memcpy。我被mmap困住了吗?我只使用过一次 mmap 有没有推荐的实现内存的方法可以调整几次?我假设我不能将 mmap 与aligned_alloc 混合使用,并且我必须在第一次调整大小时执行memcpy? (或始终使用 mmap)
下面的 realloc 并不总是对齐。我在 (64bit) linux 下使用 gcc 和 clang 进行了测试
#include<cstdlib>
#include<cstdio>
#define ALIGNSIZE 64
int main()
{
for(int i = 0; i<10; i++)
{
void *p = aligned_alloc(ALIGNSIZE, 4096);
void *p2 = realloc(p, 4096+2048); //This doesn't always align
//void *p3 = aligned_alloc(ALIGNSIZE, 4096/24); //Doesn't need this line to make it unaligned.
if (((long)p & (ALIGNSIZE-1)) != 0 || ((long)p2 & (ALIGNSIZE-1)) != 0)
printf("%d %d %d\n", i, ((long)p & (ALIGNSIZE-1)) != 0, ((long)p2 & (ALIGNSIZE-1)) != 0);
}
}
【问题讨论】:
-
不,realloc() 不保证任意对齐,只保证机器字。
-
您能在您的问题中解释为什么您需要特定的对齐方式吗?
malloc、realloc等保证返回适合作为指向当前平台上任何数据类型的指针的地址。这意味着在 64 位系统上,它至少与适合 64 位值的地址对齐,即 8 字节的倍数。 -
@Bodo 但不适用于 32/64/128 字节对齐的 simd 适合的数据。
-
@epx 不是“机器字”,而是最大自然对齐。这通常比一个词更重要。
-
@EricStotch 在您的情况下,这可能并不重要,但如果有足够的背景信息可用,通常有人可能会为您的用例提出完全不同的解决方案。这就是为什么在问题中提供此信息很有用。这也将帮助其他有类似问题的人理解您的问题并确定它是否符合他们的用例。这就是为什么我建议将您评论中的信息添加到问题中。
标签: c++ c linux realloc memory-alignment