Referenzen bei low level Datentypen langsamer?
-
Hallo!
Ich habe durch Zufall entdeckt, dass in einem Quellcode einer Templateklasse Attribute per const & zurückgegeben werden.
Diese Attribute werden später durch low level Datentypen ausgeprägt, also was wie int, bool usw.
Da steht dann z.B.
const T& GetValue() const;Macht das Sinn? Ist das egal?

-
Delryn schrieb:
Hallo!
Ich habe durch Zufall entdeckt, dass in einem Quellcode einer Templateklasse Attribute per const & zurückgegeben werden.
Diese Attribute werden später durch low level Datentypen ausgeprägt, also was wie int, bool usw.
Da steht dann z.B.
const T& GetValue() const;Macht das Sinn? Ist das egal?

Keine Ahnung, langsamer ist es auf jeden Fall nicht. Ob es Sinn macht kann ich nicht sagen, aus der Zeile Code kann man nicht grad ne Tonne Information rausziehen. Aber es ist wurscht, ob du da jetzt ein int oder ein vector zurückgibst, die Referenz kratzt das nicht.
-
Keine Ahnung, langsamer ist es auf jeden Fall nicht.
Okay, dass war der entscheidente Satz
Dann bleibt es so.
-
Also bei
int const& Foo(); int Bar();kann es schon leicht sein dass Bar() schneller ist.
Noch deutlicher kann es bei Parametern werden, denn mit der Referenz gibst du der aufgerufenen Funktion die Adresse einer Variable bekannt. Wenn diese Variable normalerweise für die Funktion nicht sichtbar/erreichbar wäre (z.B. eine lokale Variable deren Adresse du davor noch nirgends nach aussen gegeben hast), dann zwingt es den Compiler oft den Wert der Variable vor dem Funktionsaufruf in den Speicher zu schreiben, und danach wieder neu zu lesen. Selbst wenn es eine const reference ist, der Compiler vertraut normal nicht darauf dass nirgends const_cast verwendet wird und muss es daher einfach tun. Übergibst du allerdings eine Kopie kann der Compiler wenn er mag den Wert in einem Register stehen lassen.
Wenn der Compiler den Funktionsaufruf "inlinen" kann sollte es in beiden Fällen komplett egal (=gleich schnell) sein.
Wie immer gilt aber natürlich: erst gucken ob die Geschwindigkeit so wies am einfachsten oder "natürlichsten" zu programmieren ist nicht sowieso ausreicht. Und nur wenn nicht, dann einfach ausprobieren was schneller ist, und das verwenden. Kurzes Kommentar dazu wieso man es so und nicht anders gemacht hat, fertig.
-
wer angst um performance hat, kann ja boost::type_traits verwenden um zwischen T und T const& umzuschalten