从的std :: string流,而不制作副本?(Stream from std::string w

2019-08-20 21:56发布

我有,需要一个请求方法的网络客户端std::streambuf* 。 此方法实现boost::iostreams::copy它-ing到自定义std::streambuf派生类,它知道如何将数据写入到网络的API,它的伟大工程。 这意味着我可以串流文件到该请求,而不需要读它所有到内存中。

有一些情况下,然而,在大数据块都必须送到这不是一个文件,所以我包括一个重载需要一个字符串。 为了避免重复所有的网络码流中,这似乎是显而易见的,我应该成立一个streambuf表示字符串,并调用其他方法。 我能想出使这项工作的唯一办法是这样的:

std::istringstream ss(data);
send(ss.rdbuf());

不幸的是, istringstream使得数据,在某些情况下是几兆字节的副本。 它的意义在一般情况下,当然,如果你的手const引用一些对象,你不希望对象假设它可以继续使用该引用。

我工作围绕这与以下几点:

struct zerocopy_istringbuf
    : public std::stringbuf
{
    zerocopy_istringbuf(std::string const* s)
        : std::stringbuf(std::ios::in)
    {
        char* p = const_cast<char*>(s->c_str());
        setg(p, p, p + s->length());
    }
};

...

send(&zerocopy_istringbuf(data));

这似乎工作得很好,但我不知道是否真的有必要。 为什么不std::istringstream具有过载采取std::string const * ? 有一个更好的方法吗?

Answer 1:

您遇到这些问题的原因是,的std :: string是不是真的适合你在做什么。 一个更好的想法是围绕原始数据传递时使用焦炭的载体。 如果可能的话,我只想改变一切使用矢量,采用矢量::交换和参考向量作为appropriatte消除所有的复制。 如果你喜欢的输入输出流/流缓冲API,或者如果你必须处理一些需要流缓冲,这将是微不足道的创建自己的流缓冲使用的载体,像你这样的。 这将有效地做到这一点你在其他的答案中列出了同样的问题做同样的事情,但你不会违反类的合同。

否则,我认为你已经有了大概是一个istringstream通过无处不在的最佳方式向短。



Answer 2:

恕我直言,最好的选择是一个过时的类的std :: strstream



文章来源: Stream from std::string without making a copy?