new
/malloc
とallocator
によるメモリ割り当ての違いは何ですか?新規とアロケータによるメモリ割り当ての違いは何ですか
new
とmalloc
のオプションがある場合、なぜベクトル用に別々のメモリアロケータが必要なのですか?
new
/malloc
とallocator
によるメモリ割り当ての違いは何ですか?新規とアロケータによるメモリ割り当ての違いは何ですか
new
とmalloc
のオプションがある場合、なぜベクトル用に別々のメモリアロケータが必要なのですか?
私はnew
とmalloc
が異なっており、allocator
は異なる機能を提供すると思います。 malloc
は初期化されていないデータを返し、calloc
はゼロのデータを返します。しかしnew
は、あるクラスのインスタンスを作成している場合にはコンストラクタを呼び出します(int
、bool
これらののプリミティブの型ではありませんが、初期化することもできます)。 delete
はデストラクタを呼び出し、free
はデストラクタを呼び出しません。
allocator
については、ユーザーのための抽象化レイヤーを提供します。 allocator
は、構築されたオブジェクト、初期化されていないメモリ空間、またはオブジェクトを破棄したり、空間を解放したりすることができます。 STLコンテナはallocator
を使用してメモリ領域を取得し、オブジェクトを作成します。
しかし、カスタムallocator
が可能であるとして、allocator
は必ずしもnew
/delete
のようにメモリを管理していないことに注意してください。それは、メモリの大きな塊を作成することができますいくつかの割り当てキャッシュを行う。ディスク上のファイルにマップされた領域にメモリアドレスを返すことができるので、内部データが上位層によって変更されたときにファイルシステムに入ります。コンテナ。また、メモリを取得するためにnew
を呼び出すことができます。このようにして、allocator
は、ユーザがメモリの特定の領域にあるコンテナを構築することを可能にする。したがって、allocator
で、コンテナーの内部ロジックは、メモリー・ストレージの管理方法から切り離されます。
実際には上記のすべての機能を実装するためにstd::allocator
から派生したクラスを書くことができます。
あなたはallocator
Sについての詳細はthisを読むことをお勧めします。
newまたはmallocを使用すると、メモリ管理はコンパイラの実行時に対応する関数に配線されます。対照的に、アロケータが使用される場合、メモリ管理はアロケータに委譲され、アロケータは交換可能である。これにより、使用するメモリ管理機能を変更することができます。
このようなレベルの抽象化と制御が必要な理由がいくつかあります。たとえば、 Compelling examples of custom C++ STL allocators?を参照してください。あなたは新しいブロックを割り当てる必要があることを言及することでパフォーマンスを向上させるために使用することができますヒントパラメータof allocate()文献によれば
pointer allocate (size_type n, allocator<void>::const_pointer hint=0);
:allocator
クラスで
は、次のように2つのパラメータを取りallocate()
あり指定されたメモリに隣接するメモリ。だから、私はヒントを使用すると、配列のようにシーケンシャルなようなブロックを割り当てることができると思います。
アロケータはメモリマネージャです。たとえば、STLコンテナはデフォルトのアロケータを提供しますが、この記事の説明(STLアロケータのチュートリアル):http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079/Allocators-STL.htmとしてカスタマイズすることができます。
Google検索:http://wiki.answers.com/Q/What_is_the_difference_between_malloc_and_new_other_than_syntax –
Floris Velleman、私は新しいと削除の違いを探していませんでした。 – BJC
Hmm。私はどのように "複製"がこの特定の質問に答えるかは分かりません。まあ、部分的には(アロケータはプラグイン可能ですが)、割り当てと構築を区別するための特定の質問には対応していません。私はまた、downvoteの理由をよく分かりません。 –