今天在知乎上问题问了一个问题, 轮子哥的回答里面提到的内存池的概念, 但是我其实不太清楚内存池到底是什么? 顺便求知乎提问中问题的解答...
链接如下 : 用c++写正则引擎构造nfa的时候到底该用智能指针吗?
伊谢尔伦2017-04-17 14:29:19
1) 頻繁に発生する新たな削除のオーバーヘッドとメモリの断片化を避けるために、オペレーティング システムから一度に大量のメモリを申請し、その上にオブジェクトを構築し、使用後にオブジェクトをオペレーティング システムに返します。これらは、プログラムのパフォーマンスが非常に必要な場合の考慮事項です。
2)shared_ptr と unique_ptr を使用する場合、リソースの所有者を理解する必要があります。たとえば、2 つのノードが同じステータスにある場合、そのステータスは等しいため、この時点ではどのノードがリソースを解放するかを決定する必要があるかわからないため、shared_ptr も unique_ptr もアプリケーションの要件を満たしません。 経験の観点から、通常のポインターの方法で実装し、最後にグラフ全体を走査してリソースを解放し、プログラム ロジックの実装に集中できるようにすることをお勧めします。
天蓬老师2017-04-17 14:29:19
メモリの新規作成と削除のオーバーヘッドは比較的大きく、割り当てられたメモリ配列から空きメモリ ブロックを直接見つけることは比較的小さいです。そこで、事前に大きなメモリを割り当て、それを小さなメモリ ブロックに分割し、使用していないときは空きとしてマークし、使用するときはより速く取得できるようにするのがメモリ プールのプロトタイプです。シンプルで過激なアルゴリズムの方が確かに効果的だと思いますが、複雑なアルゴリズムを使用したプールは、オペレーティング システム自体の新しい削除ほど優れていません。結局のところ、オペレーティング システムはメモリ割り当てと解放のアルゴリズムを常に最適化していますが、最も保守的なアルゴリズムを選択しているだけです。戦略。
ringa_lee2017-04-17 14:29:19
2 番目の質問に関しては、最も簡単な方法は、スタックの主な構造として vector
を使用することです。より洗練された実装が必要な場合は、スペース コンフィギュレーターを自分で記述する必要があります (SGI STL の 2 層スペース コンフィギュレーターの実装を参照できます)
黄舟2017-04-17 14:29:19
「プール」という単語が付いているものは、コレクションを作成し、このコレクションに対して特定のアルゴリズムを使用してパフォーマンスを最適化し、メモリプール、大量のメモリを使用し、それを自分で管理および利用することを意味します。 。スレッド プール、多数のスレッド、管理アプリケーションを使用する場合、作成に時間を無駄にする必要はありません。適時性が優れている