C ++での使用シナリオがあります。このシナリオでは、何度も呼び出している関数が、いくつかのローカルで小さいが動的なサイズのベクトルを作成します。プログラムをプロファイリングした後、std :: vector :: free()に途方もない時間が費やされていることに気づきました。このような問題に対する自然な(C ++風の)解決策は、デフォルトのアロケータを私の使用シナリオにより適したものに切り替えることであるように思われました。特に、メモリプール戦略を使用することは、ここでは理にかなっているように思われました。ただし、boost::pool_allocはこれまでのところ問題に他なりません。私はそれを機能させましたが、私の小さいが頻繁に呼び出される関数(その関数をf()と呼びます)では割り当てが高速ですが、f()を呼び出す関数が非常に戻る前にハングします長い間。
さらに多くのプロファイリングは、すべての時間(文字通り、待つのに飽きる前の数十分)がpool_allocator :: ordered_free()に費やされていることを示しています。単純なテストプログラムでこれと同じ動作を再現しました(極端ではありませんが)。実際、構築されたベクトルの大規模なセットがメモリをシングルトンプールに戻すと、関数は非常に長い間ハングしてから戻るようです。 。
この動作を回避する方法、またはそのような問題に悩まされていない別のC ++プールアロケータを誰かが知っているなら、私は大いに義務付けられるでしょう!