Was ist der nutzen der übergabe von const-Referenzen zu primitiven Typen?
In ein Projekt, das ich pflegen, sehe ich eine Menge von code, wie dies für einfache get
/set
Methoden
const int & MyClass::getFoo() { return m_foo; }
void MyClass::setFoo(const int & foo) { m_foo = foo; }
Was ist der Punkt dabei, dass anstelle der folgenden?
int MyClass::getFoo() { return m_foo; } //Removed 'const' and '&'
void MyClass::setFoo(const int foo) { m_foo = foo; } //Removed '&'
Übergabe einer Referenz auf eine primitive Art verlangen, die gleichen (oder mehr) Aufwand wie die übergabe der Typ ist ein Wert an sich, richtig?
Es ist nur eine Nummer, nachdem alle...
Ist das nur ein versuchter Mikro-Optimierung oder ist es ein echter Vorteil?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Unterschied ist, dass wenn du das Ergebnis in eine Referenz-selbst, können Sie verfolgen die Veränderungen der integer-Membervariable in Ihre eigenen Variablen-Namen ohne Hinweis auf die Funktion.
Es ist wahrscheinlich nicht die beste design-Entscheidung, und es ist sehr gefährlich für die Rückgabe einer Referenz (const oder nicht), im Falle einer variable, wird befreit vom Umfang zurückgegeben wird. Also, wenn man wieder eine Referenz, vorsichtig sein, um sicherzustellen, dass es nicht um eine variable geht out of scope.
Gibt es einen leichten Unterschied für den Modifizierer zu, aber wieder wahrscheinlich nicht etwas, was Wert ist, getan oder beabsichtigt wurde.
Also das Endergebnis ist, dass Sie erhalten, ändert sich auch nach dem die Parameter übergeben werden.
const Foo & MyClass::makeFoo() { Foo f; return f; }
'f' geht out of scope bei '}', so der Anrufer von makeFoo hat jetzt eine ungültige Referenz. Eine alternative ist, um das Objekt zurückgeben, von Wert, oder zurückgeben einer smart-pointer, die Klone oder die Referenzzähler für das Reale Objekt.Mir, vorbei an einem const-Referenz für primitive Typen ist ein Irrtum. Entweder Sie brauchen, um den Wert zu ändern, und in diesem Fall übergeben Sie eine nicht-const Referenz, oder müssen Sie nur den Zugriff auf den Wert und in diesem Fall übergeben Sie eine const.
Const-Referenzen sollte nur verwendet werden, für komplexe Klassen, beim kopieren von Objekten könnte ein performance-problem. Im Falle der primitive, es sei denn, Sie ändern den Wert der Variablen, die Sie sollten nicht passieren eine Referenz. Der Grund dafür ist, dass Referenzen mehr Rechenzeit als nicht-Referenzen, da mit Referenzen, muss das Programm zum nachschlagen in einer Tabelle zu finden, die Adresse des Objekts. Wenn diese look-up-Zeit kürzer ist als die Uhrzeit des Kopierens, Referenzen sind eine Verbesserung.
Generell ints und Adressen haben die gleiche byte Länge low-level-Implementierungen. Also die Zeit, die das kopieren einer int als Rückgabewert für eine Funktion ist, entspricht dem Zeitpunkt des Kopierens ein Adresse. Aber in dem Fall, wo ein int zurückgegeben, no-look-up erfolgt, damit die Leistung erhöht.
Den wichtigsten Unterschied zwischen Rücksendung bei einem Wert und zurückgeben eines const-Referenz ist, dass du dann const_cast, die Referenz und den Wert verändern.
Es ist ein Beispiel für schlechtes design und ein Versuch zum erstellen eines smart design, wo einfach und prägnant design wäre mehr als genug. Statt der Rückgabe nur eines Wertes der Autor lässt die Leser von code denken, welche intention er gehabt haben dürfte.
Gibt es nicht viel nutzen. Ich habe gesehen, wie diese in Rahmen oder das makro generiert Getter und setter vor. Der makro-code nicht unterscheiden zwischen primitiven und nicht-POD-Typen und nur verwendet
const type&
pauschal für setter. Ich bezweifle, dass es eine Effizienz-Frage oder um eine echte Missverständnis, die Chancen sind, ist dies ein Konsistenz-Problem.Ich glaube, dass diese Art von code ist geschrieben, die falsch verstanden habe, das Konzept der Referenzen und verwenden Sie es für alles einschließlich der primitiven Datentypen. Ich habe auch gesehen, einige code, und kann nicht sehen keinen Vorteil, dies zu tun.
Es keinen Sinn und nutzen, außer
als dann werden Sie nicht in der Lage, um die Wiederverwendung von 'foo' - variable innerhalb "setFoo" Umsetzung. Und ich glaube, dass 'int&' ist, nur weil der Typ gerade get verwendet, um alle Dinge, die von const-Referenz und es ist nichts falsch mit, dass.