3

独自のメモリ マネージャー クラスを作成するという割り当てが与えられましたが、どこから始めればよいかまったくわかりません。私の指示は次のとおりです。

//1> write a memman allocation function
//2> insure the alloce functions returns unused addresses
//3> once all memman memmory is used up, subsequent alloces return NULL
//4> enable freeing of memory and subsequent reuse of those free'd regions

メモリ割り当てに関するガイドを探してみましたが、あまり成功していません。

4

1 に答える 1

4

これは、あなたが始めるための非常に単純なアイデアの1つです。

char arena[1000000];
char * current = arena;

void * memman(std::size_t n)
{
    char * p = current;
    current += 16 * ((n + 15) / 16);   // or whatever your alignment

    return p;
}

すべてのメモリは静的に割り当てられるため、最初のメモリ チャンクを取得するためにライブラリを呼び出す必要はありません。アラインメントが最大のポインターのみを返すようにします (ここでは 16 にハードコードされていますが、これは のような定数である必要がありますsizeof(std::maxalign_t))。このバージョンでは再利用が許可されておらず、オーバーフロー チェックが欠落しています。

再利用の場合は、空きリストを作成してみてください。

わずかなバリエーションとして、配列を の配列にすることもできますmaxalign_t。これにより、ステッピング ロジックが少し単純化されます。または、配列にuintptr_tしてメモリ自体を空きリストとして使用することもできます。

于 2012-10-22T01:03:35.137 に答える