最近看到一个有趣的问题,实现具有机制alignment的malloc函数,在网上查找资料,发现一个有趣的实现方法,在GCC下面成功运行,VS在(**void)寻址出错。
下面是实现代码:
//分配对齐地址的指针 void * aligned_malloc(int size, int alignment) { void* ptr = malloc(size + alignment); if (ptr) { //注意是加上alignment后在取与,与stl中的简单向上取整不一样,stl中的向上取整是加上(alignment-1) //这里加上alignment,能确保aligned前面的地址空间存在空白部分 void* aligned = (void*)(((long)ptr + alignment) & ~(alignment - 1)); ((void**)aligned)[-1] = ptr;//相当于*(aligned-1)的意思,由于语法错误,需要强制转换类型,意思是把ptr存放在aligned-1指向的地址的空间中 return aligned; } else return NULL; } //释放函数aligned_free void aligned_free(void *paligned) { //删除相应的地址空间 free(((void**)paligned)[-1]); }