Fluxo de std :: string sem fazer uma cópia?

Eu tenho um cliente de rede com um método de solicitação que leva umstd::streambuf*. Este método é implementado porboost::iostreams::copy-a um costumestd::streambuf-derived classe que sabe como gravar os dados em uma API de rede, que funciona muito bem. Isso significa que posso transmitir um arquivo para a solicitação sem precisar ler tudo na memória.

Existem alguns casos, no entanto, em que grandes blocos de dados devem ser enviados e não estão em um arquivo, então incluí uma sobrecarga que leva uma string. Para evitar a duplicação de todo o código de rede no fluxo, parecia óbvio que eu deveria configurarstreambuf representando a string e chama o outro método. A única maneira que eu poderia descobrir para fazer este trabalho foi algo como:

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

Infelizmente,istringstream faz uma cópia dos dados, que em alguns casos é vários megabytes. Faz todo o sentido no caso geral, é claro, se você entregar uma referência const a algum objeto, você não quer aquele objeto assumindo que ele pode continuar usando essa referência.

Eu trabalhei em torno disso com o seguinte:

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

Isso parece funcionar muito bem, mas eu me pergunto se é realmente necessário. Por que nãostd::istringstream ter uma sobrecarga tomando umstd::string const *? Existe uma maneira melhor de fazer isso?

questionAnswers(1)

yourAnswerToTheQuestion