Jeśli mam dwie różne stałe zmienne składowe, które należy zainicjować na podstawie tego samego wywołania funkcji, czy istnieje sposób, aby to zrobić bez dwukrotnego wywołania funkcji?
Na przykład klasa ułamkowa, w której licznik i mianownik są stałe.
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;
};
Powoduje to stratę czasu, ponieważ funkcja GCD jest wywoływana dwukrotnie. Możesz także zdefiniować nowego członka klasy gcd_a_b
i najpierw przypisać wyjście gcd do tego na liście inicjalizatora, ale wtedy doprowadziłoby to do marnowania pamięci.
Czy istnieje sposób, aby to zrobić bez marnowania wywołań funkcji lub pamięci? Czy możesz stworzyć tymczasowe zmienne na liście inicjalizatora? Dziękuję Ci.
-O3
. Ale prawdopodobnie dla każdej prostej implementacji testowej w rzeczywistości wstawiłoby wywołanie funkcji. Jeśli użyjesz __attribute__((const))
lub użyjesz prototypu bez podania widocznej definicji, powinien on pozwolić GCC lub clang na eliminację typowej podwyrażenia (CSE) między dwoma wywołaniami z tym samym argumentem. Zauważ, że odpowiedź Drew działa nawet w przypadku nieoczyszczonych funkcji, więc jest o wiele lepsza i powinieneś jej używać, gdy func może nie być wbudowany.