Se ho due diverse variabili dei membri costanti, che devono entrambe essere inizializzate in base alla stessa chiamata di funzione, c'è un modo per farlo senza chiamare la funzione due volte?
Ad esempio, una classe di frazione in cui numeratore e denominatore sono costanti.
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;
};
Ciò comporta una perdita di tempo, poiché la funzione GCD viene chiamata due volte. È inoltre possibile definire un nuovo membro della classe gcd_a_b
e assegnare prima l'output di gcd a quello nell'elenco di inizializzatori, ma ciò comporterebbe uno spreco di memoria.
In generale, c'è un modo per farlo senza sprecare chiamate di funzione o memoria? Puoi forse creare variabili temporanee in un elenco di inizializzatori? Grazie.
-O3
. Ma probabilmente per qualsiasi semplice implementazione di test in realtà verrebbe incorporata la chiamata di funzione. Se si utilizza __attribute__((const))
o puro sul prototipo senza fornire una definizione visibile, dovrebbe consentire a GCC o clang di eseguire l'eliminazione della sottoespressione comune (CSE) tra le due chiamate con lo stesso argomento. Nota che la risposta di Drew funziona anche per funzioni non pure, quindi è molto meglio e dovresti usarla ogni volta che la funzione potrebbe non essere in linea.