boost學習之pool

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章