• 构建自己的内存池(二)


    内存池的实现:

    1:内存池的初始化:对每个子池进行初始化流程,将子池的入口放入内存池中,初始化block状态。

    void initPools()
    {
        initPool(POOL1,(void*)pool1,POOL1_BLOCK_NUM,POOL1_BLOCK_SIZE);
        initPool(POOL2,(void*)pool2,POOL2_BLOCK_NUM,POOL2_BLOCK_SIZE);
        initPool(POOL3,(void*)pool3,POOL3_BLOCK_NUM,POOL1_BLOCK_SIZE);
        return;
    }

    void initPool(unsigned char poolId,void *pool,unsigned short blockNum,unsigned short blockSize)
    {
        BLOCK_M_T *pBmt = NULL;
        BLOCK_M_T *pPreBmt = NULL;

        g_memoryPools[poolId].blockSzie = blockSize;
        g_memoryPools[poolId].blockUsed = 0;
        g_memoryPools[poolId].pFirstBlock = (BLOCK_M_T*)pool;

        pBmt = (BLOCK_M_T*)pool;
        for(int i=0;i<blockNum;i++)
        {
            pBmt->payload = 0;
            pBmt->state = BLOCK_UNUSED|poolId;
            pBmt->pNext = (BLOCK_M_T*)((unsigned char*)(pBmt+1)+blockSize);
            pPreBmt = pBmt;
            pBmt = pBmt->pNext;
        }

        pPreBmt->pNext = NULL;
        return;
    }

     2:内存空间的分配:从指定的子池中获取空闲的block,子池中包含所有的未被分陪的block,每分配一个block后,子池中将不在包含该block。

    void* getPoolBlock(unsigned char poolId,unsigned short size)
    {
        BLOCK_M_T *pBmt = NULL;
    
        pBmt = (BLOCK_M_T*)g_memoryPools[poolId].pFirstBlock;
    
        if(!pBmt)
        {
            return NULL;
        }
    
        g_memoryPools[poolId].pFirstBlock = pBmt->pNext;
        pBmt->state = BLOCK_USED|poolId;
        pBmt->payload = size;
        pBmt->pNext = NULL;
    
        return (pBmt+1);
    }

    3:内存空间的释放:根据实际分配空间的地址可以定位到相应的block管理头,根据block管理头中的状态信息可以确定对应的子池,修改block状态然后将该block挂接到对应子池的头上。供下次分配。

    void memPools_free(void* pBlock)
    {
        BLOCK_M_T *pBmt = NULL;
        unsigned short poolId = -1;
     
        pBmt = (BLOCK_M_T*)pBlock;
    
        pBmt--;
        poolId = pBmt->state & 0x3F;
    
        pBmt->payload = 0;
        pBmt->state = BLOCK_UNUSED|poolId;
        pBmt->pNext = g_memoryPools[poolId].pFirstBlock;
        g_memoryPools[poolId].pFirstBlock = pBmt;
    
        return;
    }

    这只是一个简单内存池实现,实际的应用中可能还要考虑到效率并加上相关的调试的功能。但其包含了内存池管理的基本思想。

    转载请注明原始出处:http://www.cnblogs.com/chencheng/archive/2012/06/22/2558783.html

  • 相关阅读:
    百度生成短网址
    虚拟机开发配置
    WAMPserver配置(允许外部访问、phpmyadmin设置为输入用户名密码才可登录等)
    CSS3阴影 box-shadow的使用和技巧总结
    HTML5日期输入类型(date)
    Ubuntu18设置mysql的sql_mode
    php图片压缩-高清晰度
    微信小程序禁止下拉_解决小程序下拉出现空白的情况
    使用命令行设置MySql编码格式
    腾讯首页分辨手机端与pc端代码
  • 原文地址:https://www.cnblogs.com/chencheng/p/2558783.html
Copyright © 2020-2023  润新知