new
/malloc
とによるメモリ割り当ての違いは何allocator
ですか?
new
とのオプションがある場合、ベクトル用に別のメモリ アロケータが必要になるのはなぜでしょうmalloc
か。
new
/malloc
とによるメモリ割り当ての違いは何allocator
ですか?
new
とのオプションがある場合、ベクトル用に別のメモリ アロケータが必要になるのはなぜでしょうmalloc
か。
new または malloc を使用すると、メモリ管理はコンパイラの実行時に対応する関数に組み込まれます。対照的に、アロケータを使用すると、メモリ管理は交換可能なアロケータに委譲されます。これにより、使用するメモリ管理関数を変更できます。
この余分なレベルの抽象化と制御を行うには、いくつかの正当な理由があります。たとえば、次を参照してください: カスタム C++ STL アロケーターの説得力のある例? .
new
ええと、とmalloc
は違うと思いますし、allocator
違う機能を提供します。初期化されていないデータを返し、ゼロmalloc
化されたデータを返します。ただし、あるクラスのインスタンスを作成している場合は、コンストラクターを呼び出します(ただし、これらのプリミティブ型は初期化することもできます)。デストラクタを呼び出しますが、呼び出しません。calloc
new
int
bool
delete
free
に関してはallocator
、ユーザーに抽象化レイヤーを提供します。allocator
構築されたオブジェクト、初期化されていないメモリスペースを返すか、オブジェクトを破棄するか、スペースを解放することができます。STLコンテナはallocator
、メモリスペースを取得してオブジェクトを作成するために使用します。
ただし、カスタムallocator
が可能であるため、anallocator
は必ずしもnew
/のようなメモリを管理するわけではないことに注意してくださいdelete
。大量のメモリを作成してから、割り当てキャッシュを実行できます。ディスク上のファイルにマップされた領域のメモリアドレスを返すことができるため、内部データは上位層のコンテナによって変更されたときにファイルシステムに入ります。また、new
メモリを取得するために呼び出すことができます。このようにして、allocator
ユーザーはメモリの特定の領域にあるコンテナを構築できます。したがって、allocator
sを使用すると、コンテナの内部ロジックがメモリストレージの管理方法から分離されます。
std::allocator
実際には、上記のすべての機能を実装するために派生したクラスを作成できます。
の詳細については、これをお読みくださいallocator
。
allocator
クラスには、次allocate()
のように 2 つのパラメーターを取る があります。
pointer allocate (size_type n, allocator<void>::const_pointer hint=0);
allocate()のリファレンスによると、ヒント パラメータを使用して、指定したブロックに隣接する新しいメモリ ブロックを割り当てる必要があることを示すことで、パフォーマンスを向上させることができます。したがって、ヒントを使用して、配列の場合のようにブロックが連続するようにブロックを割り当てることができると思います。
アロケータはメモリ マネージャです。たとえば、STL コンテナーはデフォルトのアロケーターを提供しますが、この記事 (STL アロケーターのチュートリアル) で説明されているようにカスタマイズできます: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079 /Allocators-STL.htm .