没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-04-22 14:38:00.000|阅读 389 次
概述:最近在学习c++程序性能优化,读到内存池部分。自己动手写了一个,小小测试了一下应该没有问题。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
自己动手写了一个,小小测试了一下应该没有问题。
内存块MemoryBlock声明文件
MemoryBlock.h
#pragma once
#define USHORT unsigned short
#define ULONG unsigned long
#include <iostream>
using namespace std;
//内存块
struct MemoryBlock
{
USHORT m_nSize;//可分配内存总大小
USHORT m_nFree;//可分配内存单元数目
USHORT m_nFirst;//第一个可用的内存单元位置
MemoryBlock* m_pNext;//指向下一个内存块
char m_data[1];
void* operator new(size_t,const USHORT& sum,const USHORT& unit_size)
{
return ::operator new(sizeof(MemoryBlock)+sum*unit_size);//申请一个内存块空间
}
void operator delete(void* del,size_t)
{
::operator delete(del);//删除内存块空间
}
MemoryBlock(const USHORT& sum,const USHORT& unit_size)
:m_nSize(sum*unit_size),m_nFree(sum-1),m_nFirst(1),m_pNext(0)
{
char* pData=m_data;
for(int i=1;i<sum;i++)//初始化1到sum-1指向
{
*reinterpret_cast<USHORT*>(pData)=i;
pData+=unit_size;
}
}
~MemoryBlock(){}
};
内存池MemoryPool声明文件
MemoryPool.h
#pragma once
#include "MemoryBlock.h"
//内存池 a very good memory manager
class MemoryPool
{
private:
USHORT m_nUnitSize;//一个可分配单元的大小
USHORT m_nInitSize;//第一个可分配空间数目
USHORT m_nGrowSize;//新增的可分配空间数目
MemoryBlock* m_pFirst;//指向第一个内存块
public:
//单元大小,第一个内存块的可分配空间数目,第二个内存块之后的可分配空间数目
MemoryPool(const USHORT& unit_size,const USHORT& init_size=2048,
const USHORT& grow_size=1024);
~MemoryPool(void);
void* Alloc();//分配内存
void Free(void* pfree);//回收内存
void FreeMemoryBlock(MemoryBlock *pblock);//销毁
};
内存池MemoryPool实现文件
MemoryPool.cpp
#include "MemoryPool.h"
const USHORT MEMPOOL_ALIGNMENT=2;
MemoryPool::MemoryPool(const USHORT &unit_size, const USHORT &init_size, const USHORT &grow_size)
:m_pFirst(0),
m_nInitSize(init_size),
m_nGrowSize(grow_size)
{
if(unit_size>4)
{
m_nUnitSize = (unit_size + (MEMPOOL_ALIGNMENT-1)) & ~(MEMPOOL_ALIGNMENT-1);
//m_nUnitSize 取整到大于unit_size的最大的MEMPOOL_ALIGNMENT的倍数.
//令人纠结的注释
}
else if(unit_size>=2)
m_nUnitSize=4;
else
m_nUnitSize=2;
}
void* MemoryPool::Alloc()
{
if(!m_pFirst)//如果是第一次申请
{
MemoryBlock* pmb_first=new (m_nInitSize,m_nUnitSize)MemoryBlock(m_nInitSize,m_nUnitSize);//14日凌晨至此
m_pFirst=pmb_first;
return (void*)pmb_first->m_data;
}
MemoryBlock* pmb_block=m_pFirst;
while(pmb_block&&pmb_block->m_nFree==0)
//pmb_block没走到最后并且当前block没有可分配结点
{
pmb_block=pmb_block->m_pNext;//往后走吧。
}
if(pmb_block)//如果找到可分配结点的block
{
char* pfree=pmb_block->m_data+(pmb_block->m_nFirst*m_nUnitSize);
pmb_block->m_nFirst=*((USHORT*)pfree);
pmb_block->m_nFree--;//可分配节点自减
return (void*)pfree;
}
else//如果找不到,此时pmb_block值为0
{
if(m_nGrowSize==NULL)
return NULL;
pmb_block=new (m_nGrowSize,m_nUnitSize)MemoryBlock
(m_nGrowSize,m_nUnitSize);
if(!pmb_block)//new不成功
return NULL;
pmb_block->m_pNext=m_pFirst;//把新建的block放到最前吧
m_pFirst=pmb_block;
return (void*)pmb_block->m_data;
}
}
void MemoryPool::Free(void* pfree)
{
if(m_pFirst==NULL)
return;
MemoryBlock* pmb_block=m_pFirst;
MemoryBlock* pmb_preblock=m_pFirst;
while((ULONG)pfree<(ULONG)pmb_block->m_data||
(ULONG)pfree>(ULONG)(pmb_block->m_data+pmb_block->m_nSize))
//pfree不在当前block中
{
pmb_preblock=pmb_block;//前一个block块
pmb_block=pmb_block->m_pNext;
if(!pmb_block)
return;
}
pmb_block->m_nFree++;//可分配数目+1
*((USHORT*)pfree)=pmb_block->m_nFirst;
pmb_block->m_nFirst=(USHORT)((ULONG)pfree-(ULONG)
pmb_block->m_data)/m_nUnitSize;
if(pmb_block->m_nFree*m_nUnitSize==pmb_block->m_nSize)
//如何该链块为空
{
pmb_preblock->m_pNext=pmb_block->m_pNext;
if((ULONG)pmb_preblock==(ULONG)m_pFirst)
m_pFirst=NULL;
delete pmb_block;
}
}
MemoryPool::~MemoryPool(void)
{
if(m_pFirst)
FreeMemoryBlock(m_pFirst);
}
void MemoryPool::FreeMemoryBlock(MemoryBlock *pblock)
{
if(pblock->m_pNext)
FreeMemoryBlock(pblock->m_pNext);
delete pblock;
pblock=NULL;
}
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号