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

时间:2014-11-19 11:31:58

标签: c++ c++11 boost boost-asio

我需要将(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);
}

我尝试更换以下内容:

     _msg.reserve(_nBytesInMsg);
     std::copy(
        boost::asio::buffers_begin(buf),
        boost::asio::buffers_begin(buf) + _nBytesInMsg,
        _msg.begin()
    );

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

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

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

1 个答案:

答案 0 :(得分:6)

reserve并不代表您认为的含义。你可以确定reading its documentation的含义。它与resize不同;保留空间不会影响容器的size

您需要在元素中插入元素。这样做:

#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)
);