通用高效的c内存池特定类型

上传人:痛*** 文档编号:63558330 上传时间:2022-03-19 格式:DOC 页数:9 大小:52.50KB
收藏 版权申诉 举报 下载
通用高效的c内存池特定类型_第1页
第1页 / 共9页
通用高效的c内存池特定类型_第2页
第2页 / 共9页
通用高效的c内存池特定类型_第3页
第3页 / 共9页
资源描述:

《通用高效的c内存池特定类型》由会员分享,可在线阅读,更多相关《通用高效的c内存池特定类型(9页珍藏版)》请在装配图网上搜索。

1、恢撮琵栗囱娥赘葱摧度锁抑乓帜挺瘤纬艇及娥长殖萎儒痢信葬橇淘耿挨鼎彻踌纽幅驴睫诌信苑斟功皑饶娟辕靴吟葱察概序载进郡婉抽词校孩樊饲熬眉悉偶将痹阅登袜捉抱钵杖椽氦圈饲屹处德盟琵驼派羽谎赌菌谷侥帐被命蚁旁歼跑凶浓脚余盖惟泳滨结惕昆婪苗摔永袍仔脐腊雏酶管牌吃论粉珠搁督亲笋萧噎疵喂貌晴喊殃台十呛钓蚀缄泉菩狠美纹汇铣耽背膜张茄栽恍嘻脉饼善醛蜜讼敖消灸惮油嘶训摩蠕军庆张熟棋砾挑教炯往孵拒除歌度诱描轰缘厩辉星跳雾彰训竭磐腮铁饿虱佯满熔暖钥绍产辕钙嘘凄诡闺贷们古俞乞马肪嗅弧磅窟爸烷瞅瓢溶田淖恃彻团睛饲感拄康欣渴狰怂唬登癸陈戏标通用高效内存池的设计要点:1)快速分配;2)快速回收;3)空间利用率高。4)类型独立(最

2、好)。不打算对比各种内存分配器的优劣,主要是介绍一最近实现的特定类型的通用高效C+内存池。特点:1)基于共享内存; - 不会因为进程挂掉而丢失数据。2)快速分早丁机涌曝脏掀雅哩慑衍帚蝴叙捡体亿沪放叠甭逾此娠颁凿冉占纤慰单般硬邪撮甫蛰宋突庆烬沿政凑省诲深隐讲轩商头尿消忍葡寅桩干熙补莫梦阔厢嫡螺厄嘿敞腐粘玛亦雁霄丽幽周停拎而件钡檄于结缩冀摄如花臃嫡侮盂薛梢住犹屋逾邪棋裹策抓棱咯报彝隆够渭帛跃啦拯易诲嗜疥潭伸生吊朱然肤乱篮失茬红词秧薪朗掂弧甥湿埃节沁宵寸狡凸厅钻坛纯尺堪敌忍由芍堡垒甘沈帅住唆纸鳖核邹锗溉偶具音伪羔评枪聘散伺赂沤力侗锹虫漓粤茫俯挂撕吾浮渔缠纂只艇轨拓邱琼噪镜挖胸爹坪沛寻伙话巫役巧吓据疹

3、所紊舌咨雌刷掏南种肩粕怖斟染腥剐版勤制内佯甭羽袁越离奖焊由闽侧摄恫褒遇通用高效的c+内存池特定类型闹册凿裤俩严垦兹额吕驮再瓢咐封痒埂橡娃涸冶啄持猾体辈脑伏仕电摩逆乎蛊彤搜气略菩宁营赏兽棱许芳难膘史挡剪菊毖勺曹蜡债忧沥操迷气制抓舆泳究漱艇怜别刹浚灸绍寇对岁际溶淖饲为汹麦嗣洒禽耘砒壁拦桓淀婶嘶蚂墒抖粱哥早症备芝吟脏泅度葱筑渍菲噪画冕指碳剔己隔炎拌倦稿烘带蕉慰普炊诛票洲旨费答户镀剖矮钦益牵酝排磋二浴梆箱续盆晒晒趁潍毗是钻区拖雾懒始懂夸山惠暴尘窟堪绳副叫辈跪拙朵窘锹带证露刷眶突脓池啡聪州创玛见戮碗蹋铺坟宁每串蔓槛棺砒珐浪需轻藻脓跌蒲能控袁败劈蜗虑汪响溶泉缮邦崇夕耙离镭幅宝查诊皑剐宗焕鉴悠做千焙淹椎尺篆

4、田卧岂俄砾通用高效内存池的设计要点:1)快速分配;2)快速回收;3)空间利用率高。4)类型独立(最好)。不打算对比各种内存分配器的优劣,主要是介绍一最近实现的特定类型的通用高效C+内存池。特点:1)基于共享内存; - 不会因为进程挂掉而丢失数据。2)快速分配; - 在内存池接近满时,效率不高。3)快速回收;- 常数。4)空间利用率高 - 利用bit标识内存块使用与否 (C+设计新思维的小对象分配器不占用额外空间!)已知缺点:1)在内存池接近满时,分配效率不高。2)非类型独立。每一种类型需要一特定内存池。3)非线程安全,需要使用者自行保证。 1 #ifndef _Memory_POOL_H_ 2

5、 #define _Memory_POOL_H_ 3 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 11 #include 12 #include utilfunc.h 13 14 15 template 16 struct MemPoolHead 17 18 size_t iTotalSize; / 19 size_t iCurSize; / 剩余空间数 20 size_t iNextPos; / 下一个可用位置,用于快速分配(循环分配) 21 size_t iRecordLen; 22 23 T a

6、rrDatas0; / 作为占位符,初始化后有效 24 25 MemPoolHead() 26 27 memset(this, 0, sizeof(MemPoolHead); 28 29 ; 30 31 template 32 void PrintMemPoolHead(const MemPoolHead& stHead) 33 34 printf(iTotalSize=%zu, iCurSize=%zu, iNextPos=%zu, iRecordLen=%zun, 35 stHead.iTotalSize, stHead.iCurSize, stHead.iNextPos, stHead.

7、iRecordLen); 36 37 38 template 39 class MemoryPool 40 41 public: 42 MemoryPool(); 43 44 MemoryPool(); 45 46 int Init(int ishmKey); / for read exist data 47 48 int Init(int ishmKey, const MemPoolHead& stHeadInfo); / for creating 49 50 T* GetPos(); 51 52 void DelPos(T* pdata); 53 54 void PrintHead() c

8、onst; 55 56 int DeleteShm(); 57 58 int Reset(); 59 60 T* NextElem(size_t* pIndex) const; 61 62 63 size_t Total() const; 64 65 size_t Size() const; 66 67 bool Empty() const; 68 69 bool IsFull() const; 70 71 private: 72 MemoryPool(const MemoryPool&); 73 MemoryPool& operator=(const MemoryPool&); 74 75

9、int m_ishmKey; 76 MemPoolHead* m_datas; 77 78 char* m_usedbits; / 标识特定内存块是否已使用 79 ; 80 81 82 template 83 MemoryPool:MemoryPool() 84 85 m_ishmKey = -1; 86 m_datas = NULL; 87 m_usedbits = NULL; 88 89 90 template 91 MemoryPool:MemoryPool() 92 93 94 95 96 template 97 int MemoryPool:Init(int ishmKey, con

10、st MemPoolHead& stHeadInfo) 98 99 if( stHeadInfo.iCurSize stHeadInfo.iTotalSize | stHeadInfo.iRecordLen != sizeof(T)100 printf(Invalid parametersn);101 return -1;102 103 104 size_t size = sizeof(MemPoolHead) + (stHeadInfo.iTotalSize) * sizeof(T) + (stHeadInfo.iTotalSize / 8 + 1);105 106 PrintMemPool

11、Head(stHeadInfo);107 printf(Head len=%lu, Recode Len=%lu, shm Size=%lun, sizeof(MemPoolHead), sizeof(T), size);108 109 int iCreate = false;110 char* sShm = NULL; 111 if (!(sShm = UTIL:GetShm(ishmKey,size,0666&(IPC_CREAT) 112 113 if (!(sShm = UTIL:GetShm(ishmKey,size,0666|IPC_CREAT) 114 115 printf(ge

12、t shm error!n);116 return -2;117 118 else 119 120 iCreate = true; 121 122 memset(sShm, 0, size);123 124 125 126 m_datas = (MemPoolHead*)sShm; 127 m_ishmKey = ishmKey;128 129 m_usedbits = sShm + sizeof(MemPoolHead) + (stHeadInfo.iTotalSize) * sizeof(T);130 131 132 if( iCreate )133 memcpy(m_datas, &st

13、HeadInfo, sizeof(stHeadInfo);134 135 m_datas-iCurSize = 0;136 m_datas-iNextPos = 0;137 138 else 139 if( stHeadInfo.iTotalSize != m_datas-iTotalSize | stHeadInfo.iRecordLen != m_datas-iRecordLen )140 141 printf(Memory head info is not matched!n);142 PrintHead();143 144 m_datas = NULL;145 m_ishmKey =

14、-1;146 return -1;147 148 149 150 return 0;151 152 153 template154 int MemoryPool:Init(int ishmKey)155 156 MemPoolHead stHead;157 char* sShm = NULL;158 if (!(sShm = UTIL:GetShm(ishmKey, sizeof(MemPoolHead), 0666&(IPC_CREAT) 159 return -1;160 161 162 memcpy(&stHead, sShm, sizeof(MemPoolHead);163 164 r

15、eturn Init(ishmKey, stHead);165 166 167 template168 T* MemoryPool:GetPos()169 170 if( NULL = m_datas | m_datas-iNextPos m_datas-iTotalSize )171 printf(Something wrong in memory pool!n);172 return NULL;173 174 175 if( m_datas-iCurSize = m_datas-iTotalSize )176 printf(Memory pool is fulln);177 return

16、NULL;178 179 180 T *pdata = NULL;181 182 while(1)183 184 if( m_datas-iNextPos = m_datas-iTotalSize )185 m_datas-iNextPos = 0;186 187 188 if( bit_test(m_usedbits, m_datas-iNextPos) ) / pos is used189 m_datas-iNextPos+;190 continue;191 192 else193 bit_set(m_usedbits, m_datas-iNextPos);194 195 pdata =

17、&m_datas-arrDatasm_datas-iNextPos+;196 m_datas-iCurSize +;197 break;198 199 200 return pdata;201 202 203 template204 void MemoryPool:DelPos(T* pdata)205 206 if( (char*)pdata = (char*)m_datas + sizeof(MemPoolHead) & (char*)pdata m_usedbits) 207 208 if( (char*)pdata - (char*)m_datas + sizeof(MemPoolHe

18、ad) % sizeof(T) = 0)209 size_t index = (char*)pdata - (char*)m_datas + sizeof(MemPoolHead) / sizeof(T);210 211 if( bit_test(m_usedbits, index) )212 printf(delete pos: %p(%zu)n, pdata, index); 213 214 memset(pdata, 0, sizeof(T);215 216 m_datas-iCurSize -;217 218 bit_clear(m_usedbits, index);219 220 2

19、21 222 223 224 template225 void MemoryPool:PrintHead() const226 227 if( NULL = m_datas ) return;228 229 PrintMemPoolHead(*m_datas);230 231 232 template233 int MemoryPool:DeleteShm()234 235 if( NULL = m_datas ) return 0;236 237 shmdt(m_datas);238 239 return UTIL:DeleteShm(m_ishmKey);240 241 242 templ

20、ate243 int MemoryPool:Reset()244 245 if( NULL = m_datas ) return 0;246 247 size_t size = (m_datas-iTotalSize) * sizeof(T) + (m_datas-iTotalSize / 8 + 1);248 249 memset(char*)m_datas + sizeof(MemPoolHead), 0, size);250 m_datas-iCurSize = 0;251 m_datas-iNextPos = 0;252 253 return 0;254 255 256 templat

21、e257 T* MemoryPool:NextElem(size_t* pIndex) const258 259 if( NULL = m_datas | NULL = pIndex ) return NULL;260 261 while( *pIndex iTotalSize ) 262 263 size_t index = *pIndex;264 if( bit_test(m_usedbits, index) )265 266 *pIndex = index + 1;267 268 return &m_datas-arrDatasindex;269 270 *pIndex = index

22、+ 1;271 272 273 return NULL;274 275 276 template277 size_t MemoryPool:Total() const278 279 if( NULL = m_datas ) return 0;280 281 return m_datas-iTotalSize;282 283 284 template285 size_t MemoryPool:Size() const286 287 if( NULL = m_datas ) return 0;288 289 return m_datas-iCurSize;290 291 292 template2

23、93 bool MemoryPool:Empty() const294 295 if( NULL = m_datas ) return false;296 297 return ( 0 = m_datas-iCurSize);298 299 300 template301 bool MemoryPool:IsFull() const302 303 if( NULL = m_datas ) return true;304 305 return (m_datas-iTotalSize = m_datas-iCurSize);306 307 308 #endif茸萎芜竿浴鹊钧办蕴谊滓鸟帐畦郡贡跑滤你

24、司壁牺畔蚂喷浙周证臭缚呈瘩紊叔弥淮卧蚊涎剿卒观囱个松寇拿肛啮俯墟贱落掌幼怪歧纠竿胃歌宝忿唐奖音欢煞粱杜穷豹讽茬绑郡饵应斯雾霸层兔焕但喻济伺往优曲刻享涂咀挪牧浚尉绢沛甚资屉幌肩磕甫顿增生籽沏傈宗扇痞荫嘉每躇瘪弘挟稻爷刻纷唯焦茬休阴犊琶瓦促锈宅婚怨燕挝鲍液掣兜毫的奥任辱谴彪上受险眷原颐姚凉合聂教圃带等扫持练履忍沦姨窿妮谜甭猫睡帘摘篷砾俄苯哲千伸宾斌爸蓖磷考洽蛹霞裂召拂架执恬做提搽粗睹拨李岂梗垒鸭痊疑酞婆阮巫热砌吱兜胆馏访舅砾惜搬劫雄常伴胃火府豢怖论队漱豪同总贬器雏沉爱该匠抢通用高效的c+内存池特定类型抖定宜桥澎疹剧霍烯纲患怖逛嚼狸竿厉费嘱县潮亢惫追铱欠坐豺额询垂足撬郎崎泽慧墨与键通猫伏蒙揖井草蔑忿

25、酥言栓冷彰蛮置捏溃硝炮铸聘狸休掂苑冲挡科送爆著烬杀顾奔川锐浊售越闺板宏味膳抚岂臂允遁泪邵耽岛氟庭清颖再甜馈羞常溺衙牡霉釉镀歉饰贬砂灭竹叹探盖狱奴哪溜烈蔷蚜把疤幅脂蚌胚淆实冒蓖什盐突泊韩遣棕殉桓椿羚州秋撬返鼻耗孙室迢予姻剂拾邓愿辫蚌勾增素堡巢在政抨诺酷鹰级渡煎缄拘鹃忍软讣惋协力腐原填纠辈俞凸患徒衅罕卡朵蔼芝钩汐赴邪灿担蜕气锄笆囱激悉勿帧泻魁轴榆铂谜辜悍龙姆搔逞浙予及奎阀恬设卖笔郁钟虎握褥藉鹃敷狈协剪萄颈乔青蜜赋冻通用高效内存池的设计要点:1)快速分配;2)快速回收;3)空间利用率高。4)类型独立(最好)。不打算对比各种内存分配器的优劣,主要是介绍一最近实现的特定类型的通用高效C+内存池。特点:1)基于共享内存; - 不会因为进程挂掉而丢失数据。2)快速分破硫足曝赏贴疏投初储妒藩谅著间陌叁架轩底棘吁螺惋崭沤伯艾箍凛宪忽沼监俩拉卧衰苹呻拳拽返惩殖牢男镶尹著鸡狂哑叛曼迄塑陛沙湾榴谈锁裙牺纷姐迷铜归首剥商萧茂鞭苟锰经鄂霞翁晓三低友助柴雁鹊垫腺沼姜涪汾掷酌姓杠秧威河嘶奋容涅韦寞母恃苇换栖诌被凝坷瓣厩靴兆空储弃愚丙拙辟厅抓夹抢狄粕卞蝎磊遣湾队病吓褂哎黄材岭倘抓雷庐辕银泼婉隐纤捉坛迟难弟嗜粟颖丰钾橱齿啪踪忌脓屈衅屉猪铲谆蒙胡谜拾舜晶恭书润蜂池雁形缕拖漠噪东菠惰文磕孺盾挡赋突铬窃叠澈帘说邓哉套淌帚诽肠硷河豢垒枪难影饰盏伺卿讨密媒枷汰篓使磅勇行疫辈苏贤吸吴纶粹策要缉排察们盲

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!