我有一个网络客户端,其请求方法采用std::streambuf*
. 该方法是通过boost::iostreams::copy
将其添加到自定义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
超载采取 a std::string const *
?有一个更好的方法吗?