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后刚好
...