AnsiString As vs const AnsiString &As



  • Hi zusammen,
    vielleicht gab es das Thema schonmal, aber ist schwer dannach zu suchen.

    Und zwar habe ich gelesen, dass es sinnvoll ist bei einer Funktionsdeklaration statt

    void __fastcall TKlasse::TestFunktion(AnsiString Text)
    {
    }
    

    lieber

    void __fastcall TKlasse::TestFunktion(const AnsiString &Text)
    {
    }
    

    (AnsiString jetzt nur als Beispiel)

    zu schreiben, da dann AnsiString nicht kopiert werden muss, sondern eben eine Referenz verwendet wird.

    Wie seht ihr das? Ist es eher ein besserer Stil, oder bringt es gerade bei häufigeren Funktionsaufrufen tatsächlich einen Geschwindigkeitsvorteil?

    mfg



  • Hallo,

    Man sollte eigentlich immer konstante Referenzen den Kopien vorziehen. Außer es ist an der Stelle sinnvoll zu kopieren (z. Bsp. wenn der Parameter in der Funktion sowieso kopiert wird).
    Weiterhin ist es nicht sinnvoll bei einfachen Typen wie integrale Typen, Zeiger, arithmetische Typen. Bei denen ist das Kopieren etwa gleich aufwendig wie eine Referenz zu erstellen.
    Bei komplexen Typen kann es auch einen Geschwindigkeitsvorteil bieten (bei Strings allemal).



  • Super, danke dir!



  • Sorry, aber da muß ich ein wenig widersprechen, denn gerade bei AnsiString ist der Overhead sehr gering, da der eigentliche Text ja auf dem Freispeicher abgelegt wird (also nur ein Zeiger, die Größe sowie ein Referenzzähler kopiert werden müssten), so daß ein Kopieren sehr billig ist. Außerdem entfällt dann die Dereferenzierung (indirekte Adressierung) innerhalb der Funktion bei Zugriff auf den AnsiString.

    Trotzdem unterschreibe ich generell

    Braunstein schrieb:

    Man sollte eigentlich immer konstante Referenzen den Kopien vorziehen

    :p



  • Th69 schrieb:

    Sorry, aber da muß ich ein wenig widersprechen, denn gerade bei AnsiString ist der Overhead sehr gering, da der eigentliche Text ja auf dem Freispeicher abgelegt wird (also nur ein Zeiger, die Größe sowie ein Referenzzähler kopiert werden müssten), so daß ein Kopieren sehr billig ist. Außerdem entfällt dann die Dereferenzierung (indirekte Adressierung) innerhalb der Funktion bei Zugriff auf den AnsiString.

    Das mag alles sein. Sowas kann man aber nur entscheiden, wenn man den inneren Aufbau der Klasse kennt. Das wollte ich einen Anfänger jetzt nicht zumuten.
    Wenn man das genau nehmen will kann man auch solche Dinge wie eben Referenzzählung, RVO und ähnliches ansprechen die Kopieren wieder sinnvoll machen.
    siehe auch http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/


Log in to reply