Ich verwende eine interne Bibliothek , die zu imitieren eine entworfen wurden vorgeschlagen , C ++ Bibliothek , und irgendwann in den letzten Jahren sehe ich seine Oberfläche verändert verwenden std::string
zu string_view
.
Also ändere ich pflichtgemäß meinen Code, um mich an die neue Oberfläche anzupassen. Leider muss ich einen std :: string-Parameter und einen std :: string-Rückgabewert übergeben. Mein Code hat sich also wie folgt geändert:
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
zu
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()));
}
Ich verstehe wirklich nicht, was mir diese Änderung als API-Client gebracht hat, außer mehr Code (um es möglicherweise zu vermasseln). Der API-Aufruf ist weniger sicher (da die API den Speicher für ihre Parameter nicht mehr besitzt), hat wahrscheinlich die Arbeit meines Programms 0 gespeichert (aufgrund von Optimierungen, die Compiler jetzt ausführen können), und selbst wenn es Arbeit spart, wäre dies nur der Fall ein paar zuweisungen, die nach dem start oder in einer großen schleife irgendwo nicht mehr gemacht werden und nie mehr gemacht werden würden. Nicht für diese API.
Dieser Ansatz scheint jedoch den Ratschlägen zu folgen, die ich an anderer Stelle sehe, zum Beispiel die folgende Antwort :
Abgesehen davon sollten Sie seit C ++ 17 vermeiden, eine const std :: string & zugunsten einer std :: string_view zu übergeben:
Ich finde diesen Rat überraschend, da er das allgemeine Ersetzen eines relativ sicheren Objekts durch ein weniger sicheres (im Grunde genommen ein verherrlichter Zeiger und eine Länge) zu befürworten scheint, vor allem zu Optimierungszwecken.
Wann sollte string_view verwendet werden und wann nicht?
<string>
Kopfzeile und geschieht automatisch. Dieser Code täuscht und ist falsch.
std::string_view
Konstruktor niemals direkt aufrufen müssen, sondern nur die Zeichenfolgen an die Methode übergeben, die einestd::string_view
direkte Konvertierung durchführt.