¿Transmite desde std :: string sin hacer una copia?

Tengo un cliente de red con un método de solicitud que toma unstd::streambuf*. Este método es implementado porboost::iostreams::copy-lo es una costumbrestd::streambufClase derivada que sabe cómo escribir los datos en una API de red, que funciona muy bien. Esto significa que puedo transmitir un archivo a la solicitud sin necesidad de leerlo todo en la memoria.

Sin embargo, hay algunos casos en los que se deben enviar grandes bloques de datos que no están en un archivo, así que incluí una sobrecarga que toma una cadena. Para evitar la duplicación de todo el código de red en la transmisión, parecía obvio que debería configurar unstreambuf Representa la cadena y llama al otro método. La única forma en que podía entender este trabajo era algo como:

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

Desafortunadamente,istringstream realiza una copia de los datos, que en algunos casos es de varios megabytes. Por supuesto, tiene mucho sentido en el caso general, si entrega una referencia constante a algún objeto, no quiere que el objeto suponga que puede continuar usando esa referencia.

Trabajé alrededor de esto con lo siguiente:

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

Esto parece funcionar bien, pero me pregunto si es realmente necesario. Porque nostd::istringstream tener una sobrecarga tomando unastd::string const *? ¿Hay una mejor manera de hacer esto?

Respuestas a la pregunta(2)

Su respuesta a la pregunta