一)背景:
- 硬件原因:有的平台或者特定的硬件对内存访问有对齐要求
- 性能原因:cpu读取不对齐的内存可能会造成两次读取操作,影响性能
二)代码实现
例:比如要求 8bit 对齐,内存只能是8的倍数
aligned_malloc( 17, 8);
自己实现代码的关键是怎么存储原始的malloc地址信息,以及 怎么得到合适的内存地址
typedef unsign int u32;
void* aligned_malloc(u32 size, u32 align)
{
if(align& (align- 1))
{
return NULL;
}
else
{
//先申请内存 (三部分组成:sizeof(void*)->存放原始需要释放内存地址)
void *p= malloc(sizeof(void*) + size + align);
if(pbuff)
{
void *pbuf = (void*)((u32)p+sizeof(void*)); //通用做法
//ANSI C: void*可以指向任何指针,但是不能对其运算,需要转换为具体的类型才能运算
//GNU C: void*可以指向任何指针,可以运算 默认作为 char* 计算
void *pa= (void*)(((u32)(pbuf) | (align- 1)) + 1);
//把原始的分配内存的地址存储起来,以便free的时候调用把所有的内存都释放掉
((void**)pa)[-1] = p;
return pa;
}
else
{
return NULL;
}
}
}
void aligned_free(void *p)
{
//free 会根据 malloc 分配的内存首地址,找到相关管理结构体,根据size等信息来释放 相关内存
free(((void**)p)[-1]));
}
。。待续