Frage

habe ich eine sehr einfache Frage gehen, aber leider kann ich die Antwort selbst nicht verstehen.

Angenommen, ich habe einige Datenstruktur bekommt, die Einstellungen enthält und wirkt wie eine Einstellung Karte. Ich habe eine GetValue(const std::string& name) Methode, dass die Rendite der entsprechende Wert.

Nun, um herauszufinden, ich versuche - was für Return-Value-Ansatz wäre besser. Die offensichtlichste Mittel machen meine Methode wirken wie

std::string GetValue(const std::string& name) const

und gibt eine Kopie des Objekts und stützen sich auf RVO Leistungs Bedeutung.

Der andere würde bedeuten, machen zwei Methoden

std::string& GetValue(...)
const std::string& GetValue(...) const

die in der Regel bedeutet das Duplizieren Code oder mit einigen bösen Konstante Abgüsse eine dieser Routinen verwenden zweimal.

#Q

Was ist Ihre Wahl in dieser Situation sein würde, und warum?

War es hilfreich?

Lösung

Eigentlich würde ich wahrscheinlich verwenden:

std::string GetValue(const std::string& name) const;
// or
const std::string* GetValue(const std::string& name) const;

void SetValue(std::string name, std::string value);

Setter zuerst:

  • Vorbei Wert in SetValue ermöglicht es dem Compiler einige Optimierungen, die nicht mit Pass von const-Bezug genommen werden kann, ist es in einem Artikel gewesen von Dave Abrahams erklärt, "Speed? Pass nach Wert will."
  • ein Setter Verwendung ist in der Regel besser, weil Sie den Wert zu seinem Satz überprüfen können, während mit einem einfachen Verweise Sie keine Garantie haben, dass der Anrufer nicht alles tun, dumm mit den Daten.

Für die Getter:

  • durch Kopie Rückkehr scheint eine Verschwendung, da die meiste Zeit werden Sie das Objekt nicht ändern zurück (für eine Einstellungs Karte), aber Zeiger oder eine Referenz Bedeuten, dass das Objekt aliased lange genug leben wird, wenn Sie es nicht garantieren können, dann der Punkt ist strittig: Rückgabe von Wert. Die Kopie erlaubt auch zu vermeiden, dass ein internes Detail auszusetzen, zum Beispiel, wenn Sie plötzlich Schalter auf std::wstring sind, weil Sie einige Einstellungen in UTF-8 ...
  • müssen
  • Wenn Sie die Leistung benötigen, dann sind Sie bereit, einige Zugeständnisse in dieser Abteilung zu tun. Jedoch eine Referenz erlaubt Ihnen nicht das Fehlen der Eigenschaft zu signalisieren (es sei denn, Sie etwas Magie Wert haben), während der Zeiger macht es einfach (NULL ist bereits ausgeschnitten für Sie).

Andere Tipps

Das hängt von der Nutzung. Sollte GetValue("foo") = "bar" Sinn? In diesem Fall Rückkehr nach Wert nicht tun, was Sie wollen.

Wenn Sie durch konstante Referenz zurückkehren können, tun. Der einzige Grund, einen Speicher-Verwaltung Klasse wie std zurückkehren :: string von Wert ist, weil es sich um eine temporäre Zeichenfolge ist.

Dies ist ein sehr „sensibel“ Punkt von C ++. IMHO ist es eines der schwächsten Punkte von C ++ Design. AFAIK gibt es keine wirklich gute Wahl, die beide aussehen wird und gut durchführen.

Ein Punkt, der erwähnt werden sollte, dass RVO Optimierung der Regel nicht nur einen Teil des Auftrags. Ohne sie ein typischer Ausdruck wie folgt aus:

std::string txt = GetValue("...");

tatsächlich zwei Kopien produzieren! Abhängig von den Compiler, aber in der Regel RVO Optimierung eliminiert nur eine Kopie, aber der andere ist immer noch da.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top