我需要分配应该与页面大小对齐的内存。我需要将这段记忆传递给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
指针以获得正确对齐的指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)