从boost::asio::streambuf到std::string的数据高效复制

3
我需要将(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个回答

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

我想我是指调整大小;我总是混淆它们!谢谢! - stack user
@stackuser:a)这就是文档的用途,b)不要使用resize;保留和插入更好(就像我在答案中所做的那样)。 - Kerrek SB
这是一个效率提升吗? - stack user
你能解释一下为什么使用reserve和insert更好吗? - stack user
3
再次提到文档... resize 函数会初始化所有的元素,但是你随后会立即覆盖它们,所以这是没有意义的工作。 - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接