最近看到一个有趣的问题,实现具有机制alignment的malloc函数,在网上查找资料,发现一个有趣的实现方法,在GCC下面成功运行,VS在(**void)寻址出错。
下面是实现代码:
[c language=”++”]
//分配对齐地址的指针
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]);
}
[/c]