我需要将(boost::asio::)streambuf的内容复制到std::string中。
以下代码可以工作,但我认为_msg和临时std::string之间存在不必要的复制:
我尝试使用以下内容进行替换:
虽然代码编译通过了,但它并未将任何内容复制到“_msg”字符串中。
编译器(gcc4.4.7)是否会优化这种情况-例如将streambuf直接复制到_msg中而无需使用临时变量?
也许我可以使用boost :: asio :: streambuf :: const_buffers_type的迭代器使std :: copy起作用吗?
以下代码可以工作,但我认为_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起作用吗?
resize
函数会初始化所有的元素,但是你随后会立即覆盖它们,所以这是没有意义的工作。 - Kerrek SB