日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

c++实现,对象池 object_pool

發(fā)布時(shí)間:2024/2/28 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++实现,对象池 object_pool 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(jiǎn)言

1. boost的對(duì)象池object_pool在釋放時(shí)采用的遍歷,有性能問(wèn)題

2. 也不是什么大問(wèn)題,優(yōu)化后可用。但是僅僅為了一個(gè)對(duì)象池,引入boost,沒(méi)必要

3. 筆者這里一份簡(jiǎn)單實(shí)現(xiàn)的對(duì)象池,windows和linux下通用

4. 代碼量很小,僅僅兩百行,支持對(duì)象池高峰過(guò)后,逐步回收

?

接口介紹

1.?// 初始化(初始數(shù)量,一次增長(zhǎng)的數(shù)量, 單次收縮的數(shù)量)

bool init(int initNum = 200, int increaseNum = 100, int reduceNum = 50);

2. // 分配一個(gè)新對(duì)象
?? ?T* alloc();

3.?// 回收一個(gè)對(duì)象
?? ?void dealloc(T* pObj);

4.?// 執(zhí)行一次回收,用來(lái)使用高峰過(guò)后的縮減
?? ?void dorecycle();

?

代碼下載地址

windows版:https://download.csdn.net/download/yzf279533105/11989303

實(shí)驗(yàn)如下圖(特意標(biāo)記出來(lái)兩次回收之后的,每次回收50個(gè),空閑列表free_list的數(shù)量)

完整代碼

#pragma once#include <unordered_set> #include <string.h>//對(duì)象池模板類 template<class T> class class_obj_pool { public:enum{MAX_INIT_NUM = 100000, // 初始化最大數(shù)量,暫定10萬(wàn)};class_obj_pool(){clear();}~class_obj_pool(){clear();} public:// 初始化(初始數(shù)量,一次增長(zhǎng)的數(shù)量, 單次收縮的數(shù)量)bool init(int initNum = 200, int increaseNum = 100, int reduceNum = 50){// 參數(shù)檢測(cè)if (initNum <= 0 || increaseNum <= 0 || reduceNum <= 0){printf("init(), param error, initNum=%d, nIncreaseNum=%d, reduceNum=%d\n", initNum, increaseNum, reduceNum);return false;}nInitNum = initNum;nIncreaseNum = increaseNum;nShrinkNum = reduceNum;// 參數(shù)修正nInitNum = nInitNum>MAX_INIT_NUM ? MAX_INIT_NUM : nInitNum; // 初始個(gè)數(shù)nIncreaseNum = nIncreaseNum>MAX_INIT_NUM ? MAX_INIT_NUM : nIncreaseNum; // 一次增長(zhǎng)的數(shù)量// 初始化對(duì)象for (int i = 0; i<nInitNum; ++i){T* pObj = new(std::nothrow)T();if (pObj == NULL){printf("new obj failed \n");continue;}// T對(duì)象需提供init函數(shù)進(jìn)行初始化if (pObj->init() == false){printf("pObj->init() failed \n");delete pObj;continue;}free_list.insert(pObj);}return true;}// 分配一個(gè)新對(duì)象T* alloc(){T* pRet = NULL;// 空閑列表中有,則取一個(gè)if (free_list.size() > 0){unordered_set<T*>::iterator iter = free_list.begin();pRet = *iter;free_list.erase(iter);used_list.insert(pRet);// 超過(guò)最大使用記錄量,則更新if (used_list.size() > nUsedMax){nUsedMax = used_list.size();}return pRet;}// 空閑列表中沒(méi)有時(shí),則新建一批for (int i = 0; i<nIncreaseNum; i++){T* pObj = new(std::nothrow)T();if (pObj == NULL){printf("alloc(), new obj failed \n");continue;}// T對(duì)象需提供init函數(shù)進(jìn)行初始化if (pObj->init() == false){printf("pObj->init() failed \n");delete pObj;continue;}// 沒(méi)賦值的先賦值;已賦值的壓入空閑列表if (pRet == NULL){pRet = pObj;used_list.insert(pObj);}else{free_list.insert(pObj);}}// 超過(guò)最大使用記錄量,則更新if (used_list.size() > nUsedMax){nUsedMax = used_list.size();}return pRet;}// 回收一個(gè)對(duì)象void dealloc(T* pObj){if (pObj == NULL){printf("dealloc(), pObj == NULL");return;}// 不存在unordered_set<T*>::iterator it = used_list.find(pObj);if (it == used_list.end()){printf("dealloc(), find pObj failed \n");return;}// T對(duì)象需提供reset()函數(shù)進(jìn)行重置pObj->reset();free_list.insert(pObj);used_list.erase(pObj);}// 執(zhí)行一次回收,用來(lái)使用高峰過(guò)后的縮減void dorecycle(){// 空閑列表中有對(duì)象,且超過(guò)一次增量時(shí),才進(jìn)行回收int nfree = free_list.size();if (nfree <= nIncreaseNum){return;}// 要回收的數(shù)量nfree = (nfree - nIncreaseNum);int i = 0;for (unordered_set<T*>::iterator iter = free_list.begin(); iter != free_list.end();){T* pObj = *iter;if (pObj != NULL){delete pObj;}free_list.erase(iter++);// 超過(guò)一次回收的最大量,就跳出i++;if (i>=nShrinkNum){break;}}}// 打印出各個(gè)變量void showinfo(){printf("free_list.size=%d, used_list.size=%d, nUsedMax=%d \n", free_list.size(), used_list.size(), nUsedMax);}// 回收void clear(){for (std::unordered_set<T*>::iterator iter = free_list.begin(); iter != free_list.end(); iter++){T* pObj = *iter;if (pObj != NULL){delete pObj;}}free_list.clear();for (std::unordered_set<T*>::iterator iter = used_list.begin(); iter != used_list.end(); iter++){T* pObj = *iter;if (pObj != NULL){delete pObj;}}used_list.clear();nInitNum = 0; // 初始個(gè)數(shù)nUsedMax = 0; // 曾經(jīng)使用的最大個(gè)數(shù)nIncreaseNum = 0; // 一次增長(zhǎng)的數(shù)量nShrinkNum = 0; // 單次回收的最大數(shù)量} private:std::unordered_set<T*> free_list; // 空閑列表std::unordered_set<T*> used_list; // 使用中的列表int nInitNum; // 初始個(gè)數(shù)int nUsedMax; // 曾經(jīng)使用的最大個(gè)數(shù)int nIncreaseNum; // 一次增長(zhǎng)的數(shù)量int nShrinkNum; // 單次回收的最大數(shù)量 };

?

總結(jié)

以上是生活随笔為你收集整理的c++实现,对象池 object_pool的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。