实现支持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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值