Während ich etwas Code umformatierete, stieß ich auf einige Getter-Methoden, die eine std :: string zurückgeben. So etwas wie dies zum Beispiel:Rückgabe einer const-Referenz an ein Objekt anstelle einer Kopie
class foo
{
private:
std::string name_;
public:
std::string name()
{
return name_;
}
};
Sicherlich der Getter wäre besser, ein const std::string&
Rückkehr? Die aktuelle Methode gibt eine Kopie zurück, die nicht so effizient ist. Würde die Rückgabe einer const-Referenz stattdessen Probleme verursachen?
Wer sagte, dass es nicht effizient war. Es wurde eine Menge Arbeit an std :: string geleistet, um diese Operation effizient zu machen. Es besteht ein Unterschied zwischen der Übergabe einer Referenz und einer Strincg, aber der tatsächliche Unterschied ist normalerweise nicht signifikant. –
@Loki: Nichts sagt, dass es effizient sein wird, und tatsächlich sagt die neueste Version von C++, dass es wahrscheinlich sein wird. Die einzige Optimierung, die diesen Code einigermaßen effizient machen würde, wäre eine Referenz-gezählte std :: string. Viele STL-Implementierungen führen jedoch keine Referenzzählung durch, da es bei modernen Multicore-CPUs viel langsamer ist, Referenzwerte zu verwalten, als Sie vielleicht denken. Ja, die Rückgabe einer Kopie ist viel langsamer. Weder die GCC noch die Microsoft STL haben in vielen Jahren Referenzzählungen für std :: string durchgeführt. –
@seanmiddleditch: Immer messen, bevor Sie annehmen (das ist alles, was ich sage). Es gibt auch viele andere Optimierungen, die der Compiler anwenden kann: Inlining und Copy elision sind zwei, die die Kosten auf Null reduzieren. –