10

std::dequeかなりの数のオブジェクトを格納するためにを使用しています。これらのオブジェクトの束を削除すると、std :: vectorと同様に、メモリ使用量が減少しないように見えます。

それを減らす方法はありますか?ベクトルでは、「スワップトリック」を使用する必要があることを知っています。これは、ここでも機能すると思いますが、コンテナに残っているすべての要素をコピーする必要があるため、これは避けたいと思います(したがって、すべてのオブジェクトを2回保存するのに十分なメモリ)。私はdequeの実装に精通していませんが、多くのコピーがなくてもそのようなことを実現できる可能性があることを理解しています(ベクトルでは明らかにそうではありません)。

違いがあれば、VC ++(Dinkumware)STLを使用しています。

4

4 に答える 4

15

std::dequeでこれを直接行う方法はありません。ただし、一時的なものを使用することで簡単に実行できます(これは、基本的に、容量を縮小したときにstd :: vectorで発生することです)。

std::dequeに関する優れた記事をstd::vectorと比較します。一番下は、ベクトルを交換して縮小するクリーンな方法を示しています。これは、dequeでも同じように機能します。

于 2009-08-07T01:29:40.340 に答える
5

これに追加情報として:

C ++ 0x / C ++ 11では、deque(および他のいくつかのコンテナー)に「shrink_to_fit」という新しい関数があり、余分なアイテムを削除して、基本的にcapacity()== size()を揃えます。

于 2011-04-29T17:04:01.280 に答える
4

dequeのメモリサイズは縮小する場合と縮小しない場合があります。これがいつどのように発生するかは、実装によって異なります。残念ながら、dequesにはcapacity()またはreserve()さえないため、これを手動で制御することはできません。

都合の良いときにメモリ解放が実行されていないことを実際に検出した場合は、swap()をお勧めします。

dequeメモリ管理の詳細な知識は、おそらくDikum Webサイトから得られる可能性があります(これは現在の実装ですよね?)

于 2009-08-07T01:32:49.710 に答える
1

std :: dequeは、メモリをアロケータに返します。多くの場合、このアロケータはメモリをOSに返しません。このような場合、メモリが「解放」されていないように見えます。メモリがアロケータに戻されるとすぐに、優れたメモリリーク検出器が満たされ、すべてのメモリがによって解放されるわけではないことを理解しfree()ます。

于 2009-08-07T10:12:02.940 に答える