W jaki sposób mogę przejąć na własność dane char std :: string bez kopiowania i z zachowaniem kodu źródłowego std :: string object? (Chcę używać ruchomych semantykę ale między różnymi rodzajami.)Jak mogę przejąć na własność dane C++ std :: string char bez kopiowania i przechowywania obiektu std :: string?
używam C++ 11 Clang kompilator i Boost.
Zasadniczo chcę zrobić coś równoważnego do tego:
{
std::string s(“Possibly very long user string”);
const char* mine = s.c_str();
// 'mine' will be passed along,
pass(mine);
//Made-up call
s.release_data();
// 's' should not release data, but it should properly destroy itself otherwise.
}
Aby wyjaśnić, że trzeba pozbyć się std :: string: dalej w dół drogi. Kod zajmuje się zarówno danymi łańcuchowymi, jak i binarnymi i powinien obsługiwać go w tym samym formacie. I chcę danych z std :: string, ponieważ pochodzi z innej warstwy kodu, która działa ze std :: string.
Aby dać więcej perspektywy, na którą wpadnę, chcąc to zrobić: na przykład mam asynchroniczną wtyczkę do gniazda, która powinna być w stanie pobrać zarówno dane std :: string, jak i binarne od użytkownika do zapisu. Obie wersje zapisu "API" (pobierające std :: string lub dane binarne wiersza) wewnętrznie rozwiązują ten sam (binarny) zapis. Muszę unikać kopiowania, ponieważ ciąg może być długi.
WriteId write(std::unique_ptr<std::string> strToWrite)
{
// Convert std::string data to contiguous byte storage
// that will be further passed along to other
// functions (also with the moving semantics).
// strToWrite.c_str() would be a solution to my problem
// if I could tell strToWrite to simply give up its
// ownership. Is there a way?
unique_ptr<std::vector<char> > dataToWrite= ??
//
scheduleWrite(dataToWrite);
}
void scheduledWrite(std::unique_ptr< std::vecor<char> > data)
{
…
}
std :: unique_ptr w tym przykładzie zilustrować przeniesienie własności: dowolne inne podejście z tymi samymi semantyki jest w porządku ze mną.
Zastanawiam się nad rozwiązaniami dla tego konkretnego przypadku (przy pomocy std :: string char bufora) i tego typu problemami z łańcuchami, strumieniami i podobnymi ogólnymi: wskazówki, jak podejść do poruszania się buforów między ciągami, strumieniami, std kontenerami i buforem typy.
Chciałbym również docenić wskazówki i linki z podejściami do projektowania w C++ i określonymi technikami, jeśli chodzi o przekazywanie danych z bufora pomiędzy różnymi typami/typami API bez kopiowania. Wspominam, ale nie używam strumieni, ponieważ jestem chwiejny w tym temacie.
Nie może, bo nie ma sposobu, można odzyskać pamięć bezpiecznie. W pewnym momencie powinieneś zwolnić bufor, więc dlaczego nie utrzymywać struny w dół, co robi to automatycznie? –
Lepiej napisz własną implementację ciągu znaków: – Gigi
'std :: unique_ptr' byłoby jedyną rzeczą, która pozwala na coś podobnego. –
ildjarn