VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 7184|回复: 8

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

[复制链接]
001
74_avatar_middle
在线会员 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
test.PNG

pool.zip

2.52 KB, 下载次数: 22, 下载积分: 驿站币 -2





上一篇:boost 之 function and bind
下一篇:boost 库 bind自己动手实现用于连接原理

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

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

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

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

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

85_avatar_middle
online_vip kadingxiaodi 发表于 2016-9-2 10:17:50 | 显示全部楼层
学习一下自己實現的 內存池

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

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

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

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

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

回复 支持 反对

使用道具 举报

71_avatar_middle
在线会员 guzik 发表于 2018-1-26 13:52:39 | 显示全部楼层
boost 好,过来看看

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

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

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

回复 支持 反对

使用道具 举报

35_avatar_middle
在线会员 rootlife 发表于 2018-7-24 15:38:36 | 显示全部楼层
看下...   

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

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

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

回复 支持 反对

使用道具 举报

31_avatar_middle
在线会员 mango_pi 发表于 2018-10-4 23:36:57 | 显示全部楼层
来学习一下自己實現的 內存池

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

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

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

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-10-16 10:41

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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