ベクトルと比較して、キューがどれだけ多くのメモリを使用するのか疑問に思っていました。先日、約 60MB を使用する int キューの配列があり、同じデータが約 4MB を使用するベクトルのベクトルに入れられるという問題がありました。これは、プログラムのコーディングにおける私の側のエラーですか、それとも通常、stl キューはベクトルよりも多くのメモリを使用しますか?
1 に答える
はstd::queue
コンテナ アダプタであり、コンテナ自体ではありません。それでは、いくつかの実際のコンテナーのオーバーヘッドを比較してみましょう。
std::vector
はメモリ効率が非常に高く、オーバーヘッドをほとんど使用しません。Astd::vector<int>
は、ほとんどのプラットフォームで、アイテムごとに約 4 バイトを使用します。std::list
メモリの使用効率が非常に悪いため、アイテムごとにオーバーヘッドの 2 つのポインターを使用する可能性があります。Astd::list<int>
は、64 ビット プラットフォームでは項目ごとに約 24 バイトを使用し、32 ビット プラットフォームでは 12 バイトを使用します。std::deque
は 2 つの中間であり、 のデフォルト コンテナですstd::queue
。「のメモリオーバーヘッドで一体何が起こっているのか」std::deque
によると、MSVC deque は、それぞれが約 16 バイトを含むブロックのリストです。キューにそれぞれ 1 つまたは 2 つ含まれint
ていて、多くのキューの。
オーバーヘッドに影響を与えるもう 1 つの要因は、プラットフォームでのアロケーターの効率です。これは、説明できない限り、結果に色を付けます。2 つの実装間の 15 倍の違いは非常に大きく、まったく疑わしいものです。どうやってこの数値を取得したのか不思議に思います。
一般に、キューが非常に短い場合、他の実装よりも多くの改善の余地があります。独自のコンテナーを作成しても問題ない場合は、循環バッファー コンテナーを作成するか、Boost のcircular_buffer
. 循環バッファは、メモリ効率とdeque タイプの操作std::vector
の CPU 効率を組み合わせます。std::deque
そもそもSTLにあればいいのにと思います。しかたがない。
脚注
実際のオーバーヘッドの量は、実装によって異なります。