void *_aligned_malloc(size_t size,int aligned)
{
void *tempPtr = malloc(size + aligned);
char offset = aligned - ((int)tempPtr % aligned);
char *alignedPtr = (char*)tempPtr + offset;
alignedPtr[-1] = offset;
return (void*)alignedPtr;
}
void _aligned_free(void *ptr)
{
char offset = ((char*)ptr)[-1];
free((char*)ptr - offset);
}
nginx的宏定义:
#define ngx_align(d, a) (((d) + (a - 1)) & ~(a - 1))
意思是以a为对齐因子,申请d大小的空间,实际至少需要分配多大空间来实现内存对齐。
例如,按16字节对齐,申请56个字节的空间,为了内存对齐实际分配的是64字节。
1)先看~(a-1)的含义
假设a是8 对应二进制是0000 1000
(a-1)对应的就是 0000 0111
~(a-1)对应的是 1111 1000
任何一个数 与~(a-1)按位相与 就是把低三位置0 也就是把该数变成 8的倍数
对应题目中的就是 64、128的倍数,也就形成了对齐。
2)对于d + (a-1)的操作目的就是
eg:70以64对齐 结果是128而不是64的区别了。
// 实现任意字节对齐的内存分配和释放
void *AllignedMalloc(size_t size, int aligned)
{
// 判断整数是否是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-1));
// 保存原始内存地址,void*不能进行++操作,void**才能进行++操作
alignedData[-1] = data;
return alignedData; // 被转换为一级指针
}
void AlignedFree(void *data)
{
if (data)
{
free(((void **)data)[-1]);
}
}