Si tengo dos variables de miembros constantes diferentes, que deben inicializarse en función de la misma llamada a la función, ¿hay alguna manera de hacerlo sin llamar a la función dos veces?
Por ejemplo, una clase de fracción donde el numerador y el denominador son constantes.
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;
};
Esto da como resultado una pérdida de tiempo, ya que la función GCD se llama dos veces. También podría definir un nuevo miembro de clase gcd_a_b
, y primero asignar la salida de gcd a eso en la lista de inicializadores, pero luego esto conduciría a un desperdicio de memoria.
En general, ¿hay alguna manera de hacer esto sin llamadas de función o memoria desperdiciadas? ¿Quizás puede crear variables temporales en una lista de inicializador? Gracias.
-O3
. Pero probablemente para cualquier implementación de prueba simple, en realidad se alinearía la llamada a la función. Si usa __attribute__((const))
o es puro en el prototipo sin proporcionar una definición visible, debería permitir que GCC o clang hagan la eliminación de subexpresión común (CSE) entre las dos llamadas con el mismo argumento. Tenga en cuenta que la respuesta de Drew funciona incluso para funciones no puras, por lo que es mucho mejor y debe usarla siempre que la función no esté en línea.