Design Frage



  • Yo Abend, also ich hab eine Klasse wo bestimmte Funktionen öfters aufgerufen werden.

    Sollte ich die Variablen die in der Funktion die öfters aufgerufen wird diese Variablen dann Global machen? Also z.b. auf private setzen?

    Oder ist das egal?

    Es sind keine großen Variablen die da in der Funktion sind nur ein paar int und vielleicht mal ein long oder char.

    Bzw. wann macht es überhaupt Sinn eine Variable Lokal in eine Funktion zu packen wenn die Funktion in einer Klasse ist?



  • Irgendwie verwechselst du da alle möglichen Begriffe wie global/private etc. aber meine Glaskugel sagt es geht um das hier:

    class A
    {
    public:
      void foo()
      {
        int a, b, c, d;
        // Do smth with a, b, c, d
      }
    };
    

    Gegen:

    class A
    {
      int a, b, c, d;
    public:
      void foo()
      {
        // Do smth with a, b, c, d
      }
    };
    

    Variante 1 dürfte in 95% der Fälle besser designt und gleichzeitig schneller sein. Mit absoluter Sicherheit kann man das aber erst sagen wenn du die Situation konkret schilderst.



  • Allgemein gesagt sollten Variabeln so lokal wie moeglich gehalten werden. Wenn andere Funktionen nichts ueber eine Variable wissen muessen sollten sie es auch nicht koennen.

    Es kann natuerlich Ausnahmen geben, z.B. zwecks Optimierung. Das ist aber eher selten der Fall.



  • cooky451 schrieb:

    Variante 2 dürfte in 95% der Fälle besser designt und gleichzeitig schneller sein. Mit absoluter Sicherheit kann man das aber erst sagen wenn du die Situation konkret schilderst.

    warum ? ich wuerde eher sagen das variante 1 schneller sein wuerde.

    Meep Meep



  • Meep Meep schrieb:

    cooky451 schrieb:

    Variante 2 dürfte in 95% der Fälle besser designt und gleichzeitig schneller sein. Mit absoluter Sicherheit kann man das aber erst sagen wenn du die Situation konkret schilderst.

    warum ? ich wuerde eher sagen das variante 1 schneller sein wuerde.

    Meep Meep

    Kommt drauf an wie oft foo aufgerufen wird, besser gesagt, wie oft es am selben Objekt aufgerufen wird. Da du bei mehrfachen Aufrufen und lokalen Funktionsvariablen diese ständig neu erzeugen musst und am Ende wieder aufräumen musst und die Klassenvariablen ja "nur" wenn das Objekt der Klasse zerstört wird.

    MfG marco



  • Meep Meep schrieb:

    warum ? ich wuerde eher sagen das variante 1 schneller sein wuerde.

    [Gilt natürlich nur bei trivialen Konstruktoren] - Die Reservierung/Freigabe auf dem Stack kommt immer nur einer Subtraktion/Addition gleich. Das ist quasi nichts - zudem besteht noch eine gute Chance für Compileroptimierungen.
    Wenn du aber über den Objektzeiger zugreifst hast du eine Dereferenzierung, und mit Pech liegt das nicht mal im Cache.

    Eine Möglichkeit für eine Ausnahme wäre z.B. ein vorher reservierter Puffer, der nicht jedes Mal reserviert/genullt/freigegeben werden soll, und nur Zwischenergebnisse Speichert. Wobei ich das noch nie gebraucht habe.



  • ClasDesigner schrieb:

    öfters

    Was heißt öfters? 10 Mal? 1000 Mal? 1 Mio Mal?



  • cooky451:
    Aber spricht das nicht für Variante 1 und nicht 2?



  • Eisflamme schrieb:

    Aber spricht das nicht für Variante 1 und nicht 2?

    Ja, lol. Sorry. ^^


Anmelden zum Antworten