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

07-24 09:45
查看更多