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]); } }