Ist das guter Stil
-
Hallo,
ich habe eine Funktion, die eine mathematische Berechnung durchführt. Beispiel:long calc(int r) { return r*r; }Sollte solch eine Funktion in einer Schleife immer wieder aufgerufen werden:
long x[10]; for (int i = 0; i < 10; i++) x[i] = calc(i);Oder sollte man gleich ein temp Array in "calc" füllen und dann einen Zeiger zurückgeben. Dann riefe man "Calc" nicht so oft auf. Stiege dadurch dann nicht die Effizuenz?
Danke
-
Wieso sollte das effizienter sein?
Wenn du eine Berechnung hast dann sollte eine Funktion nur diese Berechnung durchführen. Wenn du nämlich an anderer Stelle mal kein Array haben willst sondern nur einmal die Berechnung ausführen willst hast du ein Problem.Biete doch einfach zusätzlich eine Funktion an, die mit einem Array arbeitet, intern aber die arraylose Funktion verwendet. Ist flexibler und jede Funktion hat eine eigene wohldefinierte Aufgabe.
-
Bei mir ist es halt so, dass diese Berechnung wieder von einer anderen Berechnung aufgerufen wird. Der Parameter wird also "durchgereicht". Die Methode wir immer wieder aufgerufen, die dann wieder eine andere aufruft. Es wird also immer eine Kopie gemacht und ich dachte das sei nicht so effizient.
Also, würdet ihr das auch so machen?
-
So eine kleine Funktion kann man auch als inline deklarieren, damit hast du dann keine Zeitverschwendung beim aufrufen, hast aber trozdem eine Funktion.

-
Bei der Methode hast du halt noch zusätzlich eine Sprunganweisung für calc. Also calc inline machen und dann ist es tatsächlich egal.
-
stil schrieb:
Es wird also immer eine Kopie gemacht und ich dachte das sei nicht so effizient.
Das wirst du nicht merken! Optimier später, schau erstmal dass dein Programm funktioniert und übersichtlich ist.
Bei den eingebauten Typen (integer, double, ...) wirst du nichts merken. Da bringt es nichtmal was, wenn Funktionsargumente per Referenz übergeben werden.
Wenn du dir unnötige Funktionsaufrufe sparen willst, schau dass der Compiler die Funktionen inlined.
-
Da bringt es nichtmal was, wenn Funktionsargumente per Referenz übergeben werden.
Ja, sie sind in der Regel ja auch genauso groß wie eine Speicheradresse Platz braucht

-
Vertraue auf deinen Compiler. Der weiss besser als du, wo Optimierung nötig ist und wo nicht. Und falls er sich schlussendlich doch irrt, findest du mit einem Profiler raus und dann kannst du dir Gedanken über solche Sachen machen.
Eine solche Funktion wird der Compiler wahrscheinlich inlinen.