Korzystam z biblioteki wewnętrznej, która została zaprojektowana tak, aby naśladować proponowaną bibliotekę C ++ , a czasami w ciągu ostatnich kilku lat widzę, że jej interfejs zmienił się z używania std::string
na string_view
.
Dlatego sumiennie zmieniam kod, aby dostosować się do nowego interfejsu. Niestety, muszę przekazać parametr std :: string i coś, co jest wartością zwracaną std :: string. Więc mój kod zmienił się z czegoś takiego:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
do
void one_time_setup(const std::string & p1, int p2) {
api_class api;
const std::string p2_storage(special_number_to_string(p2));
api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size()));
}
I naprawdę nie wiem, co ta zmiana kupił mnie jako klienta API, inne niż więcej kodu (aby ewentualnie zepsuć). Wywołanie API jest mniej bezpieczne (ponieważ API nie jest już właścicielem pamięci dla swoich parametrów), prawdopodobnie zapisał moją pracę programu 0 (ze względu na optymalizacje przenoszenia kompilatory mogą teraz zrobić), a nawet gdyby zaoszczędził pracę, byłoby to tylko kilka przydziałów, które nie zostaną i nigdy nie zostaną wykonane po starcie lub gdzieś w dużej pętli. Nie dla tego API.
Podejście to wydaje się jednak zgodne z radą, którą widzę gdzie indziej, na przykład z odpowiedzią :
Na marginesie, od C ++ 17 powinieneś unikać przekazywania const std :: string & na rzecz std :: string_view:
Uważam tę radę za zaskakującą, ponieważ wydaje się, że opowiada się ona za uniwersalnym zastąpieniem stosunkowo bezpiecznego obiektu mniej bezpiecznym (w zasadzie uwielbionym wskaźnikiem i długością), przede wszystkim w celach optymalizacji.
Kiedy więc należy użyć string_view, a kiedy nie?
<string>
nagłówku i dzieje się to automatycznie. Ten kod jest zwodniczy i zły.
std::string_view
bezpośrednio wywoływać konstruktora, powinieneś po prostu przekazać łańcuchy do metody pobierającejstd::string_view
bezpośrednio, a ona automatycznie się skonwertuje.