Methodenköpfe optimieren



  • Dies ist eigentlich wieder eine Anfängerfrage, aber das sind Details, bei denen ich gerne sicher bin 🙂

    Ich hab eine Klasse mit Methoden, die verschiedene Parameter nehmen

    class Test{
      public:
        void MethodeA(const string & msg);
        void MethodeB(const vector<string> & list);
    
    };
    

    Und ich würde sehr gerne wissen, ob die Parameter so sinnvoll sind.
    Im prinzip sind das Methoden, die von Methoden aufgerufen werden, dass bedeutet dass MethodeA und B mit Parametern gefüllt werden, die in einer anderen Methode dieser Klasse (oder einer anderen) erstellt werden.
    Dies bedeutet doch, dass MethodeA und B sowieso eine Kopie bekommen? Da wäre dann const und & nicht nötig?

    Diese Köpfe bringen mir nur was wenn ich nicht-lokale Variablen übergebe, sehe ich das richtig? Da macht dann das & Sinn.
    Aber macht das const dann so sinn? Ich gehe davon aus, dass ich in MethodeA und B den Parameter NICHT ändern will.

    MethodeB wäre dann aber ungeschickt, sehe ich das richtig? Ich kann zwar die Liste nicht modifizieren, aber ich könnten die einzelnen String einträge ändern, abhilfe würde da nur

    void MethodeB(const vector<const string> & list);
    

    schaffen, das funktioniert aber nicht wirklich gut, wenn ich in einer MethodeC einen vector<string> erschaffe, das const vector wäre dann kein Problem, aber const string (das hab ich in einem anderen Thread schon verstanden).

    Welche herangehensweise lohnt sich in einem Szenario wo die Variablen primär lokal sind? const und & weg?


  • Mod

    Elemente eines Containers werden als Teil von diesem angesehen. Ein const des Containers als Ganzem macht dessen Elemente effektiv const (weil das Interface der Container so gestaltet wurde). Umgekehrt dürfen die Elemente eines Containers niemals const deklariert werden:

    vector<const string>
    

    ist schlicht falsch. Denn einen const string kann man nicht zuweisen, dieser verletzt also die Containervoraussetzungen.



  • Oh, dass is gut zu wissen!

    Naja wenn das möglich wäre, bräuchte man eine beliebig lange initialisierungsliste, fällt mir auf 🙂

    Aber ich bin noch unsicher ob const & oder beides weg



  • Wenn du in der Methode nur lesend auf die Parameter zugreifen willst, dann ist "const &" schon richtig.
    Ohne "const" dürfest du auch Änderungen machen.
    Ohne "&" würdest du eine Kopie des gesamten Parameters (in deinem Fall vector<string>) übergeben, und das ist einfach ineffizient.



  • Ehm ja, das ist mir klar 🙂

    Aber wie gesagt, die meiste Zeit folgt der Aufruf aus anderen Methoden mit lokalen Variablen, da macht dann const & keinen sinn, oder? (Hier bin ich mir nicht sicher)



  • Es spielt keine Rolle, ob du eine globale oder lokale Variable oder eine Klassenvariable als Argument angibt. Es gilt immer meine obige Aussage!

    Noch mal explizit:
    Auch bei lokalen Variablen würdest du mit Parameter "vector<string>" eine Kopie davon übergeben!!!



  • Ich glaube das meinte ich auch nicht.

    Meine Frage ist, ob die Methoden Köpfe, wie sie oben sind, also "const string &" auch irgend einen Sinn für lokale Variablen ergeben, denn da kann man ja schlecht eine Referenz weitergeben, da wird es ja kopiert. Und wenn es kopiert wird ist es ja egal ob const, oder nicht.



  • Wieso kann man von lokalen Parametern keine Referenz weitergeben?
    Nimm einfach mal meine Aussage als Axiom so hin!

    Oder probier es einfach mal selber aus und schau dir den Assembler-Code an...



  • Seikilos schrieb:

    Ich glaube das meinte ich auch nicht.

    Meine Frage ist, ob die Methoden Köpfe, wie sie oben sind, also "const string &" auch irgend einen Sinn für lokale Variablen ergeben, denn da kann man ja schlecht eine Referenz weitergeben, da wird es ja kopiert. Und wenn es kopiert wird ist es ja egal ob const, oder nicht.

    Wie Th schon geschrieben hat, auch lokale Variablen werden als (const) Referenz übergeben wenn die Funktion/Methode eine (const) Referenz als parameter nimmt.

    Allgemein kann man sagen: alles was teuer zu kopieren ist sollte man nie "by-value" übergeben sondern immer "by-const-ref".



  • Ok, so habe ich es auch gemacht.

    Dank euch


Anmelden zum Antworten