实现支持2^n字节对齐分配的malloc和free函数

来源:互联网 发布:个人如何开通淘宝直播 编辑:程序博客网 时间:2024/05/17 18:19
#include <stdio.h>#include <stdlib.h>void* aligned_malloc(size_t size, size_t alignd_byte){//offset地址偏移量(byte)//alignd_byte对齐字节的预分配空间//sizeof(void *)保存真实指针的预分配空间size_t offset = sizeof(void *) + alignd_byte - 1;//预分配更大的内存块//q指向这块内存的首地址void* q = malloc(size + offset);if (!q)    return NULL;//printf("q = 0x%p\n", q);//对齐后的内存块//不管怎样q指针都向后偏移,再& ~(alignd_byte - 1)地址对齐//如果是任意字节对齐的话这个偏移计算方法要换void* p = (void *)(((size_t)(q)+offset) & ~(alignd_byte - 1));//为了配合free函数,保存q指针到p-1的位置//p[-1] = q;直接这样做不行void *大小未知无法寻址*(((void **)p) - 1) = q;//返回对齐后的指针return p;}void aligned_free(void* p){//计算原内存块的首地址void* q = ((void **)p)[-1];free(q);}int main(){    //对齐内存分配    int size = 1234; //需要分配的内存大小(byte)    int alignment = 128; //2^n byte地址对齐    void* p = NULL;    void* q = NULL;    int nCount = 0;//为了测试查找未alignment(byte)对齐的情况    while (1)    {        nCount++;        void* p = aligned_malloc(size, alignment); //  对齐后的        void* q = ((void **)p)[-1]; // 未处理过对齐的        if ((size_t)q % alignment != 0)        {            printf("p = %p, %d\n", p, (size_t)p % alignment);            printf("q = %p, %d\n", q, (size_t)q % alignment);            for (int i = 1; i <= size / sizeof(int); i++)            {                ((int *)p)[i - 1] = i;            }            for (int i = 1; i <= size / sizeof(int); i++)            {                printf("%d  ", ((int *)p)[i - 1]);                if (i % 10 == 0)                    printf("\n");            }            printf("\n");            aligned_free(p);            break;        }        aligned_free(p);    }    printf("nCount = %d\n", nCount);    system("PAUSE");    return 0;}
0 0
原创粉丝点击