C では、標準のメモリ処理関数はmalloc()
、realloc()
およびfree()
です。ただし、C++ stdlib アロケーターは、それらのうちの 2 つにしか対応していません。再割り当て機能はありません。もちろん、realloc()
単純にメモリをコピーすることは非集約型には適していないため、 とまったく同じことはできません。しかし、たとえば、この関数に問題があるでしょうか:
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
どこ
ptr
num_now
オブジェクトに対して同じアロケータで以前に割り当てられています。num_requested
>=num_now
;
セマンティクスは次のとおりです。
- アロケーターが特定のメモリ ブロックをオブジェクト
ptr
のサイズからnum_now
オブジェクトに拡張できる場合、アロケータはnum_requested
それを行い (追加のメモリを初期化せずに残します)、 を返しますtrue
。 - それ以外の場合は何もせずに返します
false
。
確かに、これはそれほど単純ではありませんが、私が理解しているように、アロケーターはほとんどがコンテナー用であり、コンテナーのコードは通常、既に複雑になっています。
そのような関数を考えるとstd::vector
、たとえば、 は次のように成長する可能性があります (疑似コード):
if (allocator.reallocate (buffer, capacity, new_capacity))
capacity = new_capacity; // That's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one
メモリ サイズを完全に変更できないアロケータは、無条件でそのような関数を実装できますreturn false;
。
気にする価値がないほど、再割り当て可能なアロケーターの実装はほとんどありませんか? それとも、私が見落としたいくつかの問題がありますか?