boost poolメモリプールの使用概要

3823 ワード

私の工場のメモリは普通自分で実現します.私も自分でdemo(mempool)を書いたことがあります.後でboostライブラリの中にメモリプールライブラリboost poolがあることを発見して、とても使いやすいようで、使うのがとても良くて、例は貼ることができます.
boostには4種類のメモリプールがあり、pool、object_pool, singleton_pool, pool_alloc.その中の最初の3つは応用が多いはずですが、私のところには最初の2つのdemoしかありません.
1 pool
poolは最も簡単なメモリプールクラスで、シンボルのないメモリポインタを返すことができます.私は普段C++よりはるかに多くのCを使用しているので、このクラスは実は私に適しています.
その原理は私は詳しく見ていない.理論的にも大きなメモリが割り当てられるたびに、このメモリカードは小さなブロックに分けられ、チェーンテーブルで接続されます.チェーンテーブルには、現在割り当てられているメモリと、使用中のメモリが割り当てられているメモリが少なくとも記録されます.割り当てるたびにチェーンテーブルを割り当てることができます.
彼は2つの関数さえあれば、mallocとfreeを使うことができます.フリーはプログラム猿が自分でやらなくても、pool類は自分で回収できるそうです.anyway、自分でfreeを呼び出すと大丈夫だと表示します.
呼び出し例を次に示します
typedef struct _my_pool_test_t
{
    int a;
    int b[];
} my_pool_test_t;

void test_pool()
{
    pool<> pl( sizeof(my_pool_test_t)  + 5* sizeof(int) );
    my_pool_test_t* test = (my_pool_test_t*)pl.malloc();
    test->a = 100;
    for(int i=0; i<5; i++)
    {
        test->b[i] = i+2;
    }

    cout << "pool a:\t" << test->a << endl;
    cout << "pool b2:\t" << test->b[2] << endl;
    pl.free(test);
}

そのうちmy_pool_test_t内部にはフレキシブル配列が用いられている.一つ申請します
my_pool_test_t,付与して使用する.
2 object_pool
名前からも分かるように、このメモリプールはオブジェクトメモリ次数であり、objectが割り当てられている.
彼とpoolの最大の違いもここにある.poolは毎回割り当てサイズを指定する必要がありますが、必要ありません.しかし、割り当てのタイプを指定する必要があります(実際にはタイプによってサイズを算出できます).
サンプルコードは次のとおりです.
class Class_Demo
{
    public:
        int a;
        int b;
        Class_Demo(int ia=1, int ib =2 ) : a(ia), b(ib) {}
};

void test_object_pool()
{
    object_pool <Class_Demo> pclass;
    Class_Demo *cl = pclass.malloc();
    cl = pclass.construct(2,3);
    cout << "object pool a:\t" << cl -> a << endl;
    cout << "object pool b:\t" << cl -> b << endl;
}

これがクラスクラスを直接割り当てることですDemoのメモリプール、割り当て印刷完了.
3すべてのコード
test_mem.cpp
/***************************************************************************
 * 
 * Copyright (c) 2014 Baidu.com, Inc. All Rights Reserved
 * 
 **************************************************************************/
 
 
 
/**
 * @file test_mem.cpp
 * @author liujun05([email protected])
 * @date 2014/02/26 14:04:16
 * @brief 
 *  
 **/

#include<boost/pool/object_pool.hpp>
#include<boost/pool/pool.hpp>
#include<iostream>
using namespace std;
using namespace boost;

typedef struct _my_pool_test_t
{
    int a;
    int b[];
} my_pool_test_t;

class Class_Demo
{
    public:
        int a;
        int b;
        Class_Demo(int ia=1, int ib =2 ) : a(ia), b(ib) {}
};

void test_pool()
{
    pool<> pl( sizeof(my_pool_test_t)  + 5* sizeof(int) );
    my_pool_test_t* test = (my_pool_test_t*)pl.malloc();
    test->a = 100;
    for(int i=0; i<5; i++)
    {
        test->b[i] = i+2;
    }

    cout << "pool a:\t" << test->a << endl;
    cout << "pool b2:\t" << test->b[2] << endl;
	pl.free(test);
}

void test_object_pool()
{
    object_pool <Class_Demo> pclass;
    Class_Demo *cl = pclass.malloc();
    cl = pclass.construct(2,3);
    cout << "object pool a:\t" << cl -> a << endl;
    cout << "object pool b:\t" << cl -> b << endl;
}

int main()
{
    test_pool();
    test_object_pool();
    return 0;
}

/* vim: set expandtab ts=4 sw=4 sts=4 tw=100: */

コンパイル(boostライブラリアドレスを自分で指定してください)
g++ test_mem.cpp -o mem -I ../include/ -L../lib -lboost_system -lboost_thread

実行、すべての予想内を発見
[email protected]:~/test/boost/test$ ./mem 
pool a: 100
pool b2:        4
object pool a:  2
object pool b:  3