编写支持对齐分配的malloc和free函数

   c++在很多地方都采用了对其分配内存的方式,比如一个类对象数据成员的存放就按照对齐方式存放。对齐有利于存取效率的提高:比如有些平台每次读取数据都是从偶数地址开始,若一个int型存放在偶数地址开始处,则一次读周期就可以读出这个整数,而如果存放在奇数地址处,则需要两个读周期。标准库提供的malloc和free并没有对齐的要求,需要的时候,我们可以自己实现一个对齐分配的malloc和free。

  分配内存的时候需要多分配一些空间用以调整指针的开头,使得指针的地址是对齐的。同时注意要在对齐指针的前面“额外”的空间中存放malloc实际分配得到的地址,等下释放内存空间的时候需要用此地址来释放。而且必须同时编写自己的内存释放函数,如果将对齐的地址直接传给标准的free()函数,将出现不确定的行为。

void* aligned_malloc(size_t required_bytes, size_t alignment){
    void* p1;
    void** p2;
    int offset = alignment - 1 + sizeof(void*);
    if ((p1 = (void*)malloc(required_bytes + offset)) == NULL){
        return NULL;
    }
    p2 = (void**)(((size_t)(p1)+offset) & ~(alignment - 1));
    p2[-1] = p1;
    return p2;
}

void aligned_free(void *p2){
    void* p1 = ((void**)p2)[-1];
    free(p1);
}

 

posted @ 2015-07-28 14:12  marchlyp  阅读(1092)  评论(0编辑  收藏  举报