Wenn ich zwei verschiedene konstante Elementvariablen habe, die beide basierend auf demselben Funktionsaufruf initialisiert werden müssen, gibt es eine Möglichkeit, dies zu tun, ohne die Funktion zweimal aufzurufen?
Zum Beispiel eine Bruchklasse, bei der Zähler und Nenner konstant sind.
int gcd(int a, int b); // Greatest Common Divisor
class Fraction {
public:
// Lets say we want to initialize to a reduced fraction
Fraction(int a, int b) : numerator(a/gcd(a,b)), denominator(b/gcd(a,b))
{
}
private:
const int numerator, denominator;
};
Dies führt zu Zeitverschwendung, da die GCD-Funktion zweimal aufgerufen wird. Sie können auch ein neues Klassenmitglied definieren gcd_a_b
und zuerst die Ausgabe von gcd der Ausgabe in der Initialisierungsliste zuweisen. Dies würde jedoch zu einer Verschwendung von Speicher führen.
Gibt es im Allgemeinen eine Möglichkeit, dies ohne verschwendete Funktionsaufrufe oder Speicher zu tun? Können Sie vielleicht temporäre Variablen in einer Initialisierungsliste erstellen? Vielen Dank.
-O3
. Aber wahrscheinlich würde es für jede einfache Testimplementierung tatsächlich den Funktionsaufruf inline. Wenn Sie __attribute__((const))
den Prototyp verwenden oder rein verwenden, ohne eine sichtbare Definition anzugeben, sollte GCC oder Clang die Eliminierung gemeinsamer Subexpressionen (CSE) zwischen den beiden Aufrufen mit demselben Argument durchführen. Beachten Sie, dass Drews Antwort auch für nicht reine Funktionen funktioniert, daher ist es viel besser und Sie sollten sie immer dann verwenden, wenn die Funktion möglicherweise nicht inline ist.