Estou usando uma biblioteca interna que foi projetada para imitar uma biblioteca C ++ proposta e, em algum momento nos últimos anos, vejo sua interface alterada de usar std::string
para string_view
.
Então, eu mudo obedientemente meu código, de acordo com a nova interface. Infelizmente, o que eu tenho que passar é um parâmetro std :: string e algo que é um valor de retorno std :: string. Então, meu código mudou de algo assim:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
para
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()));
}
Eu realmente não vejo o que esta mudança me comprou como o cliente API, que não seja mais código (possivelmente para estragar). A chamada da API é menos segura (devido ao fato de a API não possuir mais o armazenamento de seus parâmetros), provavelmente salvou o trabalho do meu programa 0 (devido às otimizações de movimentação que os compiladores podem fazer agora) e, mesmo se salvou o trabalho, isso seria apenas algumas alocações que nunca serão e nunca seriam feitas após a inicialização ou em um grande loop em algum lugar. Não para esta API.
No entanto, essa abordagem parece seguir os conselhos que eu vejo em outros lugares, por exemplo, esta resposta :
Como um aparte, desde o C ++ 17, você deve evitar passar uma const std :: string e a favor de uma std :: string_view:
Acho esse conselho surpreendente, pois parece defender universalmente a substituição de um objeto relativamente seguro por um objeto menos seguro (basicamente um ponteiro e comprimento glorificados), principalmente para fins de otimização.
Então, quando string_view deve ser usado, e quando não deveria?
<string>
cabeçalho e acontece automaticamente. Esse código é enganador e errado.
std::string_view
construtor diretamente, basta passar as strings para o método que recebe umstd::string_view
diretamente e ele será convertido automaticamente.