题目
在面试时被问到如何实现对齐内存分配,当时是懵了,没想到响应的答案,到了出来的时候,才猛然发现,原来是底层的指针操作的问题,特此记录一下。
代码
#include <stdio.h>
#include <stdlib.h>
void* alignAlloc(size_t aligned, int sz)
{
assert((aligned &(aligned-1)) == 0);
void* data = malloc(sz + sizeof(void *) + aligned); // 这里先分配比原sz大一点的空间
if (!data) return NULL;
void ** tmp = (void **)data + 1; //跳过留存原地址的一个指针空间
void **ret = (void **) (((size_t)tmp + aligned - 1) & (aligned-1)); //这里实际上是对aligned进行取余得到对齐的地址
ret[-1] = data;
return ret;
}
void free(void* p)
{
if (p){
free(((void **)p)[-1]);
}
}