Unterschied bei get-Methoden



  • Hallo,
    ich habe eine ganz einfache Frage, nichts Kompliziertes, allerdings komme ich trotz meiner Suche, auch hier im Forum, zu keiner Antwort.

    const string& getName() { return name; }
    double getStand() { return stand; }
    

    Das ist ein aus einem Beispiel aus dem Buch 'C++ lernen und professionell anwenden'.

    Wieso ist der Rückgabewert nur beim String eine konstante Refferenz und nicht bei Double?
    Sind ja beides get-Methoden.



  • Ein double zu kopieren ist nicht aufwendig. Das sind normalerweise 8 Bytes. Bei einem string kann das schon aufwendiger werden, da er jede Menge Daten speichern kann. Mit einer konstanten Referenz wird diese Kopie vermieden.



  • Im ersten Fall wird eine Referenz zurückgegeben, also der dein eigener String! Der soll vom Anwender nicht verändert werden.
    Im zweiten Fall ist es return-by-value also der Wert...Dieser ist kein l-value und kann durch Zuweisung in einem Double gespeichert werden, es wird also kopiert.



  • patrick246 schrieb:

    Ein double zu kopieren ist nicht aufwendig. Das sind normalerweise 8 Bytes. Bei einem string kann das schon aufwendiger werden, da er jede Menge Daten speichern kann. Mit einer konstanten Referenz wird diese Kopie vermieden.

    Das war auch meine Schlussfolgerung, aber ich war mir nicht sicher.

    Erleuchter schrieb:

    Im ersten Fall wird eine Referenz zurückgegeben, also der dein eigener String! Der soll vom Anwender nicht verändert werden.
    Im zweiten Fall ist es return-by-value also der Wert...Dieser ist kein l-value und kann durch Zuweisung in einem Double gespeichert werden, es wird also kopiert.

    Habe ich das richtig verstanden, weil man den Wert einfach zuweisen kann, nimmt man in dem Fall keine Refferenz oder wie?



  • gf.sunshen schrieb:

    Habe ich das richtig verstanden, weil man den Wert einfach zu weisen kann, nimmt man in dem Fall keine Refferenz oder wie?

    Kopieren wuerde bei kleineren Typen mindestens genauso lange dauern, wie eine Referenz zu uebergeben. Die Referenz wird intern ja als pointer uebergeben, also 4 oder 8 byte. Wenn man in dem Bereich liegt, macht das keinen Unterschied und by-value zu uebergeben ist oft einfacher und uebersichtlicher.



  • Nein. Zuweisen kannst du das schon, aber es soll nicht verändert werden können.

    Einen std::string kopieren ist teuer (stell dir vor du hast ein riesiges XML von mehreren Millionen Zeichen/Zeilen da gespeichert), also gibst du es per Referenz zurück (was ja intern auch nur ein Zeiger ist) und das ist effektiv eine Kopie von 4 bzw. 8 Byte (auf den üblichen Systemen 32/64 Bit).
    Aber jetzt kann der Anwender deinen String ändern und damit eventuelle interne Zustände zerstören.
    Die Lösung ist, dass du die Referenz konstant machst. Jetzt kann der User nur lesen, aber nicht ändern oder schreiben.

    Wenn er doch schrieben will, kann er sich den string kopieren und da drin rumschreiben und später die entsprechende Getter Methode deiner Klasse aufrufen.



  • Danke an euch alle, ich habe es jetzt verstanden.



  • patrick246 schrieb:

    Ein double zu kopieren ist nicht aufwendig. Das sind normalerweise 8 Bytes. Bei einem string kann das schon aufwendiger werden, da er jede Menge Daten speichern kann. Mit einer konstanten Referenz wird diese Kopie vermieden.

    wobei der Bezeichner "name" jetzt auch nicht gerade danach klingt, als würde eine by-value Kopie Terabytes verschlingen. Aber Du hast natürlich recht, es kann aufwändiger werden.



  • Der string muss erst Speicher anfordern und in diesen kopieren, während bei der Referenz normalerweise nur mit der Adresse gearbeitet wird. Es müssen ja nicht viele Daten im String sein, aber ich würde trotzdem behaupten, dass letzteres schneller ist.


Log in to reply