2013-02-17 10 views
5

new/mallocallocatorによるメモリ割り当ての違いは何ですか?新規とアロケータによるメモリ割り当ての違いは何ですか

newmallocのオプションがある場合、なぜベクトル用に別々のメモリアロケータが必要なのですか?

+1

Google検索:http://wiki.answers.com/Q/What_is_the_difference_between_malloc_and_new_other_than_syntax –

+2

Floris Velleman、私は新しいと削除の違いを探していませんでした。 – BJC

+3

Hmm。私はどのように "複製"がこの特定の質問に答えるかは分かりません。まあ、部分的には(アロケータはプラグイン可能ですが)、割り当てと構築を区別するための特定の質問には対応していません。私はまた、downvoteの理由をよく分かりません。 –

答えて

1

私はnewmallocが異なっており、allocatorは異なる機能を提供すると思います。 mallocは初期化されていないデータを返し、callocゼロのデータを返します。しかしnewは、あるクラスのインスタンスを作成している場合にはコンストラクタを呼び出します(intboolこれらののプリミティブの型ではありませんが、初期化することもできます)。 deleteはデストラクタを呼び出し、freeはデストラクタを呼び出しません。

allocatorについては、ユーザーのための抽象化レイヤーを提供します。 allocatorは、構築されたオブジェクト、初期化されていないメモリ空間、またはオブジェクトを破棄したり、空間を解放したりすることができます。 STLコンテナはallocatorを使用してメモリ領域を取得し、オブジェクトを作成します。

しかし、カスタムallocatorが可能であるとして、allocatorは必ずしもnew/deleteのようにメモリを管理していないことに注意してください。それは、メモリの大きな塊を作成することができますいくつかの割り当てキャッシュを行う。ディスク上のファイルにマップされた領域にメモリアドレスを返すことができるので、内部データが上位層によって変更されたときにファイルシステムに入ります。コンテナ。また、メモリを取得するためにnewを呼び出すことができます。このようにして、allocatorは、ユーザがメモリの特定の領域にあるコンテナを構築することを可能にする。したがって、allocatorで、コンテナーの内部ロジックは、メモリー・ストレージの管理方法から切り離されます。

実際には上記のすべての機能を実装するためにstd::allocatorから派生したクラスを書くことができます。


あなたはallocator Sについての詳細はthisを読むことをお勧めします。

2

newまたはmallocを使用すると、メモリ管理はコンパイラの実行時に対応する関数に配線されます。対照的に、アロケータが使用される場合、メモリ管理はアロケータに委譲され、アロケータは交換可能である。これにより、使用するメモリ管理機能を変更することができます。

このようなレベルの抽象化と制御が必要な理由がいくつかあります。たとえば、 Compelling examples of custom C++ STL allocators?を参照してください。あなたは新しいブロックを割り当てる必要があることを言及することでパフォーマンスを向上させるために使用することができますヒントパラメータof allocate()文献によれば

pointer allocate (size_type n, allocator<void>::const_pointer hint=0); 

allocatorクラスで

0

は、次のように2つのパラメータを取りallocate()あり指定されたメモリに隣接するメモリ。だから、私はヒントを使用すると、配列のようにシーケンシャルなようなブロックを割り当てることができると思います。

関連する問題