编写支持对齐分配的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后刚好
    ...
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 很多新学C语言的童鞋在用到动态内存分配的时候,对选择哪种分配函数及其有何区别搞不清楚,那么下文就认真的讲讲它们的种...
    Leon_Geo阅读 4,668评论 0 2
  • 内存的历史 现代的intel处理器可以追溯到最早期的intel芯片。1.8085处理器充分利用了芯片整合技术,它将...
    Mr_Bluyee阅读 4,073评论 0 0
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 12,373评论 0 27
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,731评论 0 6
  • 作为一个群星四宫的人,"家"在我心目中无疑占据重要位置。想到家,各种思念浮现脑海。记忆的画面,留下的是难忘而美好的...
    yingying_226e阅读 1,118评论 0 1