我需要分配应该与页面大小对齐的内存。我需要将此内存传递给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
指针才能获得正确对齐的指针。