编写支持对齐分配的malloc和free函数

Q.编写支持对齐分配的malloc和free函数,分配内存时,malloc函数返回的地址必须能被2的n次方整除。

Ans.思路:

  • 假设对齐为alignment,需要向上补齐为整数个alignment,所以多分配alignment-1个字节
  • 另外为了释放这段内存,可以将其实位置放在对齐内存块的前面
void* aligned_malloc(size_t required_bytes, size_t alignment) {
  void* p1;
  void** p2;
  int offset = alignment - 1 + sizeof(void *);
  if ((p1 = (void*)malloc(required_bytes + offset)) == NULL) {
    return NULL;
  }
  p2 = (void **)(((size_t)(p1) + offset) & ~(alignment-1));
  p2[-1] = p1;
  return p2;
}

void aligned_free(void *p2) {
  void* p1 = ((void**)p2)[-1];
  free(p1);
}

在(size_t)(p1) + offset 这段区间内总是可以找到一个起始地址为alignment整数倍的起始地址。

  • 例如0 - 字节就是该地址
    例如1- 则加上15后刚好
    ...

你可能感兴趣的:(编写支持对齐分配的malloc和free函数)