【问题标题】:boost::asio::streambuf shrink-to-fit?boost::asio::streambuf 缩小以适应?
【发布时间】:2012-10-26 00:11:12
【问题描述】:

boost::asio::streambuf 大小将继续增加,直到调用 consume()。
即使调用了consume(),底层缓冲区使用的内存也永远不会被释放。

例如:下面的代码首先创建了一个streambuf,没有指定max_size。 然后它将 14Mb 数据转储到 streambuf 中。 然后它会消耗所有这些 14MB 数据。 在 2000 点,streambuf.size() 为 0,但“top”显示该进程仍占用 14MB 内存。

我不想指定 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;
}

【问题讨论】:

标签: c++ boost boost-asio shrink streambuf


【解决方案1】:

所以,我查看了来源,我发现了两个观察结果。

  1. 你是对的,缓冲区被实现为 std::vector,但是这个 成员是私有的,没有任何访问者。

  2. consume 方法未触及该字段。

对于您的情况,您应该在使用后销毁缓冲区对象。这是解决问题的最简单方法。出于优化目的,您可以记住最后一个缓冲区大小并通过将最后一个大小传递给构造函数来创建具有给定容量的新缓冲区。您可以围绕此功能编写一个包装器以实现可读代码。

【讨论】:

  • 感谢您的确认。就我而言,破坏和重建是不可接受的,这比设置 max_size 还要糟糕。好吧,如果没有办法缩小它,我想我必须在它上面设置一个 max_size。
猜你喜欢
  • 1970-01-01
  • 2017-09-02
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2016-09-19
相关资源
最近更新 更多