任意字节对齐的内存分配和释放。
源码实现
// 实现任意字节对齐的内存分配和释放
void *AllignedMalloc(size_t size, int aligned)
{
// aligned is a power of 2
assert((aligned&(aligned - 1)) == 0);
// 分配内存空间
void *data = malloc(sizeof(void *)+aligned + size);
// 地址对齐
void **temp = (void **)data + 1;
void **alignedData = (void **)(((size_t)temp + aligned - 1)&-aligned);
// 保存原始内存地址
alignedData[-1] = data;
return alignedData; // 被转换为一级指针
}
void AlignedFree(void *data)
{
if (data)
{
free(((void **)data)[-1]);
}
}
代码解析
这里以32位系统,16字节对齐为例,用示意图表示更加清楚一点。
原始分配内存图
下面考虑两种情况:
这里要注意转为二级指针后:
1. 指向的内存区域是指针变量,存放的是地址,即编译器对内存的解析发生变化
2. 对void **进行自增++,移动的是一个指针变量的大小
个人觉得,上面的图将源码的原理表达的还是比较清楚的,有什么问题的,欢迎大家留言讨论,时间不早了,睡觉了.
2016-5-31 01:12:45