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工作?
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)