任意の長さのブロックが要求される一般的なメモリ割り当ての問題に対してのみ断片化があります。ここでの問題は、このメモリレイアウトが与えられた場合です。
@@@@@@---@--@-@@@@
(ここで@
、は使用中を-
意味し、無料を意味します)
合計6つの空きブロックがありますが、4つの連続ブロックを割り当てることはできません。したがって、管理対象スペースの合計量を増やす必要があります(可能な場合)。また、この一般的なシナリオでは、どのアドレスを選択するかを決定することは簡単ではなく、断片化の程度に影響を与えるいくつかの戦略(ファーストフィット、ワーストフィットなど)があります。
あなたの場合、割り当てたい領域は常に整数のサイズになることがわかっているので、問題は非常に簡単ですk
(たとえばk = sizeof(T)
)。これは、あなたが好きなように整理する完璧にフィットするブロックを常に持っていることを意味します。空き領域をリンクリストであるかのように処理し、常にリストの最初の項目を使用してメモリ割り当て要求に応答します。
@@@---@@@------@@@@@@@@@---@@@ (k=3)
これで、割り当てを償却するために大きなブロックで割り当てたい場合は、特定のブロックが空になったときにそのブロックを解放するために、特定のブロックで使用されているスロットの数の追加カウンターを保持できます(スロットのリザーバーを縮小したい場合! )。
最も使用されているブロックから常に新しいメモリブロックを配布することを主張する場合は、どのブロックが最もいっぱいであるかを示す追加のリストを使用してこれを行うことができます。O(1)
使用するスロットの数は常に1つしか変更できないため、隣接するノードを交換するだけで、そのリストを並べ替えておくことができます。