从boost :: asio :: streambuf到std :: string的高效数据副本

sta*_*ser 2 c++ boost boost-asio c++11

我需要将(boost :: asio::) streambuf的内容复制到std :: string.

以下代码有效,但我认为_msg和临时std :: string之间存在不必要的副本:

Msg (boost::asio::streambuf & sb, size_t bytes_transferred) :
    _nBytesInMsg    (bytes_transferred)
{
    boost::asio::streambuf::const_buffers_type buf = sb.data();

    _msg = std::string(
        boost::asio::buffers_begin(buf),
        boost::asio::buffers_begin(buf) + _nBytesInMsg);
}
Run Code Online (Sandbox Code Playgroud)

我尝试用以下内容替换:

     _msg.reserve(_nBytesInMsg);
     std::copy(
        boost::asio::buffers_begin(buf),
        boost::asio::buffers_begin(buf) + _nBytesInMsg,
        _msg.begin()
    );
Run Code Online (Sandbox Code Playgroud)

在编译时,它不会将任何内容复制到_msg字符串.

编译器(gcc4.4.7)会优化这种情况 - 例如将streambuf直接复制到_msg而不使用临时的吗?

是否有一个迭代器,我可以使用boost :: asio :: streambuf :: const_buffers_type,以使std :: copy工作?

Ker*_* SB 6

reserve并不意味着你认为它意味着什么.您可以通过阅读其文档来确定其含义.它不一样resize; 保留空间不会影响容器的大小.

您需要实际将元素插入到字符串中.做这个:

#include <algorithm>    // for copy
#include <iterator>     // for back_inserter

_msg.reserve(_nBytesInMsg);  // about to insert _nBytesInMsg elements

std::copy(
    boost::asio::buffers_begin(buf),
    boost::asio::buffers_begin(buf) + _nBytesInMsg,
    std::back_inserter(_msg)
);
Run Code Online (Sandbox Code Playgroud)

  • @stackuser:再次,文档...`resize`初始化所有元素,但你会立即覆盖它们.这是毫无意义的工作. (2认同)