我需要将(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工作?
答案 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)
);