特定のサイズ(MAX_OBJECT_SIZEと呼びましょう)を超えることのない複数のオブジェクトを割り当てるプログラム(C++など)があるとします。
また、ヒープ上にリージョン(「ページ」と呼びます)があります(たとえば、malloc(REGION_SIZE)で割り当てられます。ここで、REGION_SIZE> = MAX_OBJECT_SIZE)。
いっぱいになったスペースが PAGE_SIZE に等しくなるまで (または少なくとも > PAGE_SIZE - MAX_OBJECT_SIZE になるまで)、そのページにスペースを確保し続けます。
ここで、より多くのメモリを割り当てたいと思います。明らかに、以前の「ページ」では十分ではありません。したがって、少なくとも 2 つのオプションがあります。
- NEW_SIZE > PAGE_SIZE の realloc(page, NEW_SIZE) を使用します。
- 新しい「ページ」(page2) を割り当て、そこに新しいオブジェクトを配置します。
カスタム割り当て関数が必要な場合は、次のようにします。
- 最初の方法を使用して、どれだけ満たしたかを確認し、そこに新しいオブジェクトを配置します (オブジェクトのサイズを、満たされたメモリ変数に追加します)。
- 2 番目の方法を使用すると、ページのリスト (ベクトル? 配列?) を取得し、現在のページを探して、選択したページで 1 と同様の方法を使用します。
最終的には、メモリを解放する方法も必要になりますが、その部分は理解できます。
私の質問は次のとおりです。このような問題を解決する最も効率的な方法は何ですか? それはオプション 1、オプション 2、またはここで検討していない他のオプションですか? 現実世界の状況で結論を引き出すには、小さなベンチマークが必要ですか、または十分ですか? 操作が異なればパフォーマンスも異なる可能性があることは理解していますが、全体的な指標を探しています。