如何分配页面大小alignment的内存?

我需要分配内存应该是页面大小alignment。 我需要将这个内存传递给一个计算所有数据块异或的ASM代码。 我需要用malloc()来做到这一点。

有这个功能,你应该使用。

如果不能,无论出于何种原因,那么通常这样做的方式是将块大小添加到分配大小,然后使用整数数学欺骗来舍弃指针。

像这样的东西:

 /* Note that alignment must be a power of two. */ void * allocate_aligned(size_t size, size_t alignment) { const size_t mask = alignment - 1; const uintptr_t mem = (uintptr_t) malloc(size + alignment); return (void *) ((mem + mask) & ~mask); } 

这并没有经过很深入的测试,但你明白了。

请注意,以后无法找出正确的指针来free()内存。 为了解决这个问题,我们不得不增加一些额外的机器:

 typedef struct { void *aligned; } AlignedMemory; AlignedMemory * allocate_aligned2(size_t size, size_t alignment) { const size_t mask = alignment - 1; AlignedMemory *am = malloc(sizeof *am + size + alignment); am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask); return am; } 

这包括了指针的一些小技巧,并且给了你一个可以free()的指针,但是你需要取消引用aligned指针来获得正确对齐的指针。

我不认为只有使用malloc才是可能的。 你可以使用memalign() :

 char *data = memalign(PAGESIZE, alloc_size); 

其中PAGESIZE是页面的大小, alloc_size是要分配的内存的大小。

页面的大小可以通过sysconf(_SC_PAGESIZE)

使用posix_memalign获取已经对齐的内存。

注意: vallocmemalign都已经过时了。

使用valloc而不是malloc – 它具有与malloc相同的签名,但是它分配页面对齐的内存。 请注意,您仍然使用free()free()内存。

还要注意, valloc在技​​术上是过时的,所以考虑使用posix_memalign ,尽管这不是malloc的简单替换,因为它具有非常不同的函数签名。