Uso una libreria interna progettata per imitare un proposta libreria C ++ , e qualche volta negli ultimi anni vedo la sua interfaccia modificata dall'uso di std::string
a string_view
.
Quindi devo doverosamente modificare il mio codice, per conformarmi alla nuova interfaccia. Sfortunatamente, quello che devo passare è un parametro std :: string, e qualcosa che è un valore di ritorno std :: string. Quindi il mio codice è cambiato da qualcosa del genere:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
a
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 veramente non vedo che cosa questo cambiamento mi ha comprato come client API, a parte un maggior numero di codice (probabilmente per rovinare). La chiamata dell'API è meno sicura (a causa dell'API che non possiede più la memoria per i suoi parametri), probabilmente ha salvato il mio programma 0 (a causa dell'ottimizzazione dello spostamento che i compilatori possono fare ora) e anche se salvasse il lavoro, sarebbe solo un paio di allocazioni che non verranno e non verranno mai eseguite dopo l'avvio o in un grande ciclo da qualche parte. Non per questa API.
Tuttavia, questo approccio sembra seguire i consigli che vedo altrove, ad esempio questa risposta :
As an aside, since C++17 you should avoid passing a const std::string& in favor of a std::string_view:
Trovo sorprendente questo consiglio, in quanto sembra sostenere la sostituzione universale di un oggetto relativamente sicuro con uno meno sicuro (fondamentalmente un puntatore e una lunghezza glorificati), principalmente ai fini dell'ottimizzazione.
Quindi quando dovrebbe string_view essere usato, e quando non dovrebbe?