Strumień ze std :: string bez tworzenia kopii?

Mam klienta sieciowego z metodą żądania, która pobierastd::streambuf*. Ta metoda jest zaimplementowana przezboost::iostreams::copy- do zwyczajustd::streambuf-derived class, który wie, jak zapisać dane do sieciowego interfejsu API, który działa świetnie. Oznacza to, że mogę przesyłać strumieniowo plik do żądania bez konieczności odczytywania go do pamięci.

Istnieją jednak przypadki, w których trzeba przesłać duże bloki danych, których nie ma w pliku, więc załączyłem przeciążenie, które pobiera ciąg. Aby uniknąć powielania całego kodu sieciowego w strumieniu, wydawało się oczywiste, że powinienem skonfigurować astreambuf reprezentujący łańcuch i wywołujący inną metodę. Jedynym sposobem, w jaki mogłem zrobić tę pracę, było coś w rodzaju:

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

Niestety,istringstream tworzy kopię danych, która w niektórych przypadkach wynosi kilka megabajtów. Ma to sens w ogólnym przypadku, oczywiście, jeśli podasz stałe odwołanie do jakiegoś obiektu, nie chcesz tego obiektu, zakładając, że może on nadal używać tego odniesienia.

Pracowałem nad tym w następujący sposób:

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

Wydaje się, że działa dobrze, ale zastanawiam się, czy to naprawdę konieczne. Dlaczego niestd::istringstream mieć przeciążenie przystd::string const *? Czy jest lepszy sposób, aby to zrobić?

questionAnswers(2)

yourAnswerToTheQuestion