Si j'ai deux variables de membres constants différentes, qui doivent toutes deux être initialisées en fonction du même appel de fonction, existe-t-il un moyen de le faire sans appeler la fonction deux fois?
Par exemple, une classe de fraction où le numérateur et le dénominateur sont constants.
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;
};
Cela se traduit par une perte de temps, car la fonction GCD est appelée deux fois. Vous pouvez également définir un nouveau membre de classe gcd_a_b
, et affecter d'abord la sortie de gcd à celle de la liste d'initialisation, mais cela entraînerait un gaspillage de mémoire.
En général, existe-t-il un moyen de le faire sans appels de fonctions ou mémoire gaspillés? Pouvez-vous peut-être créer des variables temporaires dans une liste d'initialisation? Je vous remercie.
-O3
. Mais probablement pour toute implémentation de test simple, cela entraînerait en fait l'appel de fonction. Si vous utilisez __attribute__((const))
ou pur sur le prototype sans fournir de définition visible, il devrait laisser GCC ou clang faire l'élimination de sous-expression commune (CSE) entre les deux appels avec le même argument. Notez que la réponse de Drew fonctionne même pour les fonctions non pures, c'est donc beaucoup mieux et vous devez l'utiliser à tout moment où la fonction pourrait ne pas être en ligne.