2017-10-13 4 views
2

私はmalloc/freeへの反復呼び出しが高価である可能性があり、この理由から、C++標準ライブラリコンテナはデストラクタでfreeを呼び出すのではなく、メモリプールを使用することを読んでいます。また、これは、C++標準ライブラリコンテナのパフォーマンスが、必要なCスタイルの配列を手動で割り当てたり割り当てを解除したりするよりも高くなる可能性があることを意味しています。malloc/freeペアが同じジョブを実行しているとしたら、C++標準ライブラリコンテナがメモリプールを使用するのはなぜですか?

しかし、私は今、私はCのFAQに読んでいることから、このことについて困惑している:のmalloc /無料の(http://c-faq.com/malloc/freetoOS.html

ほとんどの実装では、オペレーティング・システムに解放されたメモリを返しませんが、同じプログラム内で将来のmalloc呼び出しに利用できるようにするだけです。

これは、本質的にmalloc/free関数はC++標準ライブラリのコンテナとして非常に同じ仕事をしようということを意味します。彼らは、プール内のメモリを維持し、プログラム片を与えることによって、繰り返し主張/再利用のメモリを最適化しようこのプールのリクエストに応じて。一度実行すればそのような最適化の利点を見ることができますが、わたしの直感は、これをいくつかの異なる抽象レイヤーで同時に開始すると、パフォーマンスが実際に低下する可能性があることを示しています。

ここで私は何を誤解していますか?

+0

あなたがここで誤解していることは、あなたの仕事がC++ライブラリ自体を書くことを必要としない限り、これは誰にとっても問題ではないはずです。私は20年以上のハッキングC++でこれが本当に気にしていたことを思い出すことはできませんでした。 –

+1

@SamVarshavchikこれは、私が「なぜこのように構成されているのか、そうではないのか」についての質問を、単純な好奇心から、あるいは学ぶのを妨げるものではありません。 – gaazkam

答えて

1

標準ライブラリの一部の実装では、メモリプールが使用されます。

一般的に、特定のコンテナのメモリニーズを知っている場合、コンテナの特定のニーズを知らない汎用メモリマネージャよりも、メモリ管理の面で優れた仕事をすることができます。

たとえば、std::list<int>を使用している場合、リスト内のすべてのノードは同じサイズであり、コンテナには未使用ノードのリストが保持されます(空きリストにノードを追加または削除するポインタ割り当て)は、未使用のノードをnew/delete(malloc/free)によって使用される、より一般的ですがより複雑な汎用メモリマネージャに戻すよりも高速です。

0

mallocと呼ばれる一般的なメモリ管理ユーティリティは、一般的なケースのシナリオでは一般的に最適化されています。 システムは複数のプロセスをサポートする必要があるため、それぞれ異なる動作をします。この最適化は、一部のアプリケーションでは優れている可能性があります。互換性を最大化

  • : 汎用アロケータは、次の一般的なガイドラインを考慮しようとするアロケータは、プラグインの互換性他の人とでなければなりません。特に、ANSI/POSIXの規則に従うべきです。
  • 移植性の最大化:できるだけ少ないシステム依存機能(システムコールなど)を使用しながら、一部のシステムでのみ使用できるその他の便利な機能をオプションでサポートします。アラインメントおよびアドレッシングルールに関する既知のシステム制約すべてに準拠する。
  • スペースを最小限に抑える:アロケータはスペースを無駄にするべきではありません:システムからできるだけ少ないメモリを取得し、断片化を最小限に抑える方法でメモリを保持する必要があります - 使用されていない連続したメモリチャンクプログラムによって。
  • 最小化時間:malloc()、free()およびreallocルーチンは、平均的な場合にはできるだけ高速にする必要があります。
  • チューニング可能性の最大化:任意の機能および動作は、静的(#defineなどを介して)または動的に(malloptなどの制御コマンドを介して)ユーザーによって制御可能でなければなりません。
  • ローカリティの最大化:一般的にお互いの近くで一緒に使用されるメモリのチャンクを割り当てます。これにより、プログラム実行中のページミスやキャッシュミスを最小限に抑えることができます。
  • エラー検出の最大化:汎用のアロケータがPurifyなどの汎用メモリエラーテストツールとして機能するとは思われません。しかし、アロケータは、メモリの上書き、複数の解放などによる破損を検出するための手段を提供する必要があります。
  • 最小化異常

このスニペットは、長年の間、事実上のメモリ管理アルゴリズムだったダグ・リーのmalloc、と呼ばれているものについて大きなdocument written by Doug Leaから取られた、と私はすべてのプログラマがこれを読むべきだと思いました。

逆に、コンテナが作成されると、コンパイル時には多くの要素がわかります。実行時に予測できる要素が多くあります。例えば、保持しようとしているオブジェクトのサイズがわかっています。 この知識を使用して、汎用コンテナでうまく動作するように標準コンテナが作成されました。

関連する問題