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

#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;
}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页