#include<boost/pool/pool.hpp>
#include <boost/pool/object_pool.hpp>
#include <boost/pool/single_poolton.hpp>
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;
using namespace boost;
class demo_class
{
public:
int a,b,c;
demo_class(int x=1,int y=2,int z=3):a(x),b(y),c(z){}
};
//內存池學習
int main(int argc, char** argv)
{
//簡單內存池,只能作用域int long 簡單的
pool<> p1(sizeof(int));//0m~@個m~O0m~H~Fm~E~Mintm~Z~Dm~F~E0m~X0m|
//pool分配內存失敗不檢測異常,所以使用應該檢測
int* p =(int*)p1.malloc();
assert(p1.is_from(p)) ;// m~X[0m~Nm~F~E0m~X0m| 中m~H~Fm~E~Mm~H0m~Z~D
p1.free(p); //m~[| 爲0m~Km~][0m~Am~T[0m~Lm~I~@以m~G~Jm~T[0m~L0m~Bm~^~\m~F~E0m~X0m| 大0m~O0m~_m~Z~D0m~]0m~Lm~O0m~Mm~G~Jm~Tm
for(int i = 0; i< 100; i++)
{
p1.ordered_malloc(10);//m~@~@m~G[0m~\m~T0m~_~_m~P~Nm~G0m~J0m~G~Jm~Tm
}
//object_pool
object_pool<demo_class> pde;//對象內存池
demo_class* pdc = pde.malloc(); //分配原始內存塊,分配時並不調用構造函數,請注意
assert(pde.is_from(pdc));
assert(pdc->a != 1); //指向的內存未做初始化
pdc =pde.construct(7,8,9); //構造一個對象,可以傳遞參數,和構造函數保持一致
assert(pdc->a == 7);
//推薦直接只用construct,//不是先malloc,再construct
//construct 默認最多接受3個參數
object_pool<string> ops;
for(int i=0 ; i<10;i++)
{
string *s = ops.construct("hello object");//construct內部會自己malloc
cout << *s << endl;//出作用域後自動釋放
}
//single_pool 類始於static的模式,需要手動釋放內存
//single_pool 模板第一根參數爲分配的單價類型,第二個參數爲分配的大小
typedef singleton_pool<demo_class, sizeof(demo_class)> sps; //單件內存池定義
demo_class* dc1 = (demo_class*)sps::malloc(); //全部採用靜態調用
assert(sps::is_from(dc1));
sps::release_memory();
return 0;
}
boost學習之pool
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.