2

質問の目的で、最初にn個のブロックが割り当てられたメモリプールがあるとします。ただし、容量に達すると、プールは大きくなり、2倍のサイズ(2n)になります。

これで、このサイズ変更操作はCで実行できますがrealloc、関数自体が別のメモリへのポインタを返す場合があります(古いデータがコピーされます)。

これは、メモリプールアロケータによって返されたポインタが無効になっている可能性があることを意味します(メモリが移動された可能性があるため)。

この問題を克服するための良い方法は何でしょうか?それとも可能ですか?

4

2 に答える 2

4

複数の連続していないメモリ プールから割り当てます。1 つのプールがいっぱいになったら、2 番目のプールを割り当てて、仮想アドレス空間内の別の場所に配置できるようにします。

次に問題は、プールの場所を追跡することです。通常、各プールのスペースの一部を簿記に使用します。たとえば、1 つのポインターに相当するスペースを予約して、すべてのプールの単純な線形リンク リストを保持することができます。より洗練されたアロケーターは、より多くの簿記のオーバーヘッドを必要とする傾向があります。

于 2012-11-13T00:06:55.060 に答える
1

realloc を使用する代わりに、ブロックの新しい/追加のチャンクを malloc します (プール アロケータによって管理および返され、返されるブロックが、単一の連続したメモリ チャンクにある必要がある理由がないと仮定します)。

于 2012-11-13T00:07:31.990 に答える