21

事前に一定量のメモリを割り当て、そのメモリを残りのプログラムに使用したいと考えています。プログラムは基本的に、いくつかの文字列と構造体にメモリを割り当てます。これを実装するにはどうすればよいですか?ポインターを格納するために使用されるデータ構造と、それを使用して特定の量を取得するにはどうすればよいですか?

たとえば、1 MB のスペースを malloc してポインタpに格納した場合、そこから 250 KB のピースを切り出すにはどうすればよいでしょうか?

これは、迅速で汚い実装を意図したものです。

4

2 に答える 2

23

メモリをプールに戻せるようにしたい場合は、さらに複雑になります。ただし、迅速でそれほど汚れていないアプローチでは、再利用できるコードを実装することをお勧めします...

typedef struct pool
{
  char * next;
  char * end;
} POOL;

POOL * pool_create( size_t size ) {
    POOL * p = (POOL*)malloc( size + sizeof(POOL) );
    p->next = (char*)&p[1];
    p->end = p->next + size;
    return p;
}

void pool_destroy( POOL *p ) {
    free(p);
}

size_t pool_available( POOL *p ) {
    return p->end - p->next;
}

void * pool_alloc( POOL *p, size_t size ) {
    if( pool_available(p) < size ) return NULL;
    void *mem = (void*)p->next;
    p->next += size;
    return mem;
}

私の経験では、このようなプールを使用して多くのオブジェクトを割り当てる場合、無駄にならないように必要なメモリ量を事前に計算したいと思いますが、間違いを犯したくありません (十分に割り当てないなど)。そこで、すべての割り当てコードをループ内に配置し、空のプールで「ダミー」割り当てを実行するフラグを受け入れるようにプール割り当て関数を設定しました。2 回目のループでは、既にプールのサイズを計算しているので、プールを作成して実際の割り当てをすべて同じ関数呼び出しで行うことができ、コードの重複はありません。メモリが割り当てられていない場合、ポインター演算ではこれを行うことができないため、提案されたプール コードを変更する必要があります。

于 2012-08-01T01:07:06.240 に答える