4

boost :: asio :: streambufのサイズは、consume()が呼び出されるまで増加し続けます。
消費()が呼び出された後でも、基になるバッファによって使用されているメモリが解放されることはありません。

例:次のコードは、max_sizeを指定せずに最初にstreambufを作成しました。次に、14Mbのデータをstreambufにダンプします。次に、それらすべての14MBのデータを消費します。ポイント2000では、streambuf.size()は0ですが、「top」は、プロセスがまだ14MBのRAMを使用していることを示しています。

max_sizeを指定したくありません。とにかくそれが空になった後にstreambufを縮小することはありますか?

#include <boost/asio.hpp>
#include <iostream>
#include <string>

int main()
{
    {
        boost::asio::streambuf b;
        std::ostream os(&b);

        for(int i= 0; i<1000000; ++i)
        {
            os << "Hello, World!\n";
        }
        std::cout<<"point 1000"<<std::endl;
        std::cout<<"size="<<b.size()<<std::endl;
        // at this point, the streambuf's size is close to 14MB.


        b.consume(b.size());
        std::cout<<"point 2000"<<std::endl;
        std::cout<<"size="<<b.size()<<std::endl;
        // at this point, the streambuf.size() is 0
        // but the streambuf's underlying buffer, which is a vector I assume,
        // still hold that 14MB space.
        // "top" shows the process size is 14M


    }

    // at this point, "top" showed the process size shrinks to almost zero
    std::cout<<"point 4000"<<std::endl;
    return 0;
}
4

1 に答える 1

2

それで、私は情報源を調べました、そして、2つの観察が私に現れます。

  1. そうです、バッファはstd :: vectorとして実装されていますが、このメンバーはプライベートであり、それにアクセスするものはありません。

  2. 消費メソッドはこのフィールドに触れません。

あなたの場合、消費後にバッファオブジェクトを破棄する必要があります。これが問題に対処する最も簡単な方法です。最適化の目的で、最後のバッファーサイズを記憶し、最後のサイズをコンストラクターに渡すことで、指定された容量で新しいバッファーを作成できます。この機能のラッパーを記述して、読み取り可能なコードを実現できます。

于 2012-11-06T08:03:08.070 に答える