Von std :: string streamen, ohne eine Kopie zu erstellen?

Ich habe einen Netzwerk-Client mit einer Anforderungsmethode, die einestd::streambuf*. Diese Methode wird von implementiertboost::iostreams::copy-es zu einem Brauchstd::streambuf-abgeleitete Klasse, die weiß, wie die Daten in eine Netzwerk-API geschrieben werden, was sehr gut funktioniert. Dies bedeutet, dass ich eine Datei in die Anforderung streamen kann, ohne dass alles in den Speicher eingelesen werden muss.

Es gibt jedoch einige Fälle, in denen große Datenblöcke gesendet werden müssen, die sich nicht in einer Datei befinden. Daher habe ich eine Überladung eingefügt, die eine Zeichenfolge erfordert. Um zu vermeiden, dass der gesamte Netzwerkcode im Stream dupliziert wird, schien es mir offensichtlich, dass ich eine einrichten solltestreambuf Darstellen der Zeichenfolge und Aufrufen der anderen Methode. Der einzige Weg, wie ich herausfinden konnte, um diese Arbeit zu machen, war so etwas wie:

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

Unglücklicherweise,istringstream erstellt eine Kopie der Daten, die in einigen Fällen mehrere Megabyte beträgt. Im allgemeinen Fall ist es natürlich vollkommen sinnvoll, wenn Sie eine konstante Referenz auf ein Objekt übergeben, das Sie nicht möchten, vorausgesetzt, es kann diese Referenz weiterhin verwenden.

Ich habe das folgendermaßen umgangen:

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

Dies scheint gut zu funktionieren, aber ich frage mich, ob es wirklich notwendig ist. Warum nicht?std::istringstream habe eine Überlastung unter astd::string const *? Gibt es einen besseren Weg, dies zu tun?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage