VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 4414|回复: 5

[原创] 自己實現的 內存池

[复制链接]
zuiwuchang 发表于 2016-8-31 15:50:30 | 显示全部楼层 |阅读模式
boost的內存池 為了 節省內存佔用 而在算法上 存在效率問題 特別是 object_pool
近日 寫一程式 需要  不斷生成 一塊數據緩存區 之後 銷毀 再創建再銷毀 於是就 自己寫了個 內存池

pool_chunk 可以申請固定大小內存  在構造時傳入 之後調用 malloc_chunk free_chunk 申請 釋放 內存
pool_object 模板類 需要傳入 一個 模板參數 指定 創建 c++對象的 內存池 public 方法基本同 pool_chunk 只是 現在 調用 construct destory 申請釋放資源

pool_chunk pool_object使用了boost組件 需要自己配置 boost環境

exmaple
  1. #include <gtest/gtest.h>

  2. #ifdef _DEBUG
  3. #pragma comment(lib,"gtest-mdd.lib")
  4. #else
  5. #pragma comment(lib,"gtest-md.lib")
  6. #endif


  7. #include <dark-cpp/pool/pool_chunk.hpp>
  8. #include <dark-cpp/pool/pool_object.hpp>

  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.         testing::InitGoogleTest(&argc, argv);
  12.         int rs = RUN_ALL_TESTS();

  13.        
  14.         std::system("pause");
  15.         return rs;
  16. }

  17. //new delete test
  18. TEST(UnPoolTest, HandleNoneZeroInput)
  19. {
  20.         int count = 10;
  21.         int need = 10000;
  22.         std::list<char*> list;
  23.         for(int i=0;i<count;++i)
  24.         {
  25.                 for(int j=0;j<need;++j)
  26.                 {
  27.                         char* p = new char[1024];
  28.                         EXPECT_TRUE(p);
  29.                         list.push_back(p);
  30.                 }

  31.                 BOOST_FOREACH(char* p,list)
  32.                 {
  33.                         delete p;
  34.                 }
  35.                 list.clear();
  36.         }
  37. }

  38. //test pool_chunk
  39. TEST(PoolPoolTest, HandleNoneZeroInput)
  40. {
  41.         dark::pool::pool_chunk pool(1024,boost::make_shared<boost::mutex>());
  42.         int count = 10;
  43.         int need = 10000;
  44.         std::list<void*> list;
  45.         for(int i=0;i<count;++i)
  46.         {
  47.                 for(int j=0;j<need;++j)
  48.                 {
  49.                         void* p = pool.malloc_chunk();
  50.                         EXPECT_TRUE(p);
  51.                         list.push_back(p);
  52.                 }
  53.                 EXPECT_EQ(pool.get_frees(),0);
  54.                 EXPECT_EQ(pool.get_mallocs(),need);

  55.                 BOOST_FOREACH(void* p,list)
  56.                 {
  57.                         pool.free_chunk(p);
  58.                 }
  59.                 list.clear();

  60.                 EXPECT_EQ(pool.get_frees(),need);
  61.                 EXPECT_EQ(pool.get_mallocs(),0);
  62.         }

  63.         pool.release_memory(5);
  64.         EXPECT_EQ(pool.get_frees(),5);
  65.         pool.release_memory();
  66.         EXPECT_EQ(pool.get_frees(),0);
  67. }

  68. class Animal
  69. {
  70. public:
  71.         std::string name;
  72.         char buf[1024];
  73.         Animal(const std::string& name)
  74.         {
  75.                 this->name = name;
  76.         }
  77.         virtual ~Animal()
  78.         {

  79.         }
  80. };
  81. //test pool_object
  82. TEST(PoolPoolObjectTest, HandleNoneZeroInput)
  83. {
  84.         dark::pool::pool_object<Animal> pool(boost::make_shared<boost::mutex>());
  85.         int count = 10;
  86.         int need = 10000;
  87.         std::list<Animal*> list;
  88.         for(int i=0;i<count;++i)
  89.         {
  90.                 for(int j=0;j<need;++j)
  91.                 {
  92.                         Animal* p = pool.construct("cat");
  93.                         EXPECT_TRUE(p);
  94.                         list.push_back(p);
  95.                 }
  96.                 EXPECT_EQ(pool.get_frees(),0);
  97.                 EXPECT_EQ(pool.get_mallocs(),need);

  98.                 BOOST_FOREACH(Animal* p,list)
  99.                 {
  100.                         pool.destory(p);
  101.                 }
  102.                 list.clear();

  103.                 EXPECT_EQ(pool.get_frees(),need);
  104.                 EXPECT_EQ(pool.get_mallocs(),0);
  105.         }

  106.         pool.release_memory(5);
  107.         EXPECT_EQ(pool.get_frees(),5);
  108.         pool.release_memory();
  109.         EXPECT_EQ(pool.get_frees(),0);
  110. }
复制代码


更詳細用法見
https://github.com/zuiwuchang/da ... ment/pool/pool.html
https://github.com/zuiwuchang/dark-cpp

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入驿站

x

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

祸起蛋炒饭 发表于 2016-9-1 09:55:42 | 显示全部楼层
BOOST   好厉害  我没时间去学习  现收藏啦

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

Syc 发表于 2016-9-1 22:15:17 | 显示全部楼层
灰常不错的技巧,加精支持!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

kadingxiaodi 发表于 2016-9-2 10:17:50 | 显示全部楼层
学习一下

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

SummerGull 发表于 2017-8-23 20:50:40 | 显示全部楼层
怎么又是繁体字 ,,这我真的是,。。,。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

68ui 发表于 2017-9-18 17:15:23 | 显示全部楼层
不错的代码, 对boost依赖不是很强, 很多特征在C++11已经提供,或者多写几行代码就可以去掉对boost的依赖。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站

本版积分规则

展开

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )

返回顶部
x

VC驿站微信公众号cctry2009

GMT+8, 2017-12-14 04:28

Powered by Discuz!

© 2009-2017 cctry.com

快速回复 返回顶部 返回列表