Se eu tiver duas variáveis de membros constantes diferentes, que precisam ser inicializadas com base na mesma chamada de função, existe uma maneira de fazer isso sem chamar a função duas vezes?
Por exemplo, uma classe de fração em que numerador e denominador são 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;
};
Isso resulta em perda de tempo, pois a função GCD é chamada duas vezes. Você também pode definir um novo membro da classe,gcd_a_b
, e primeiro atribuir a saída do gcd à da lista de inicializadores, mas isso levaria à perda de memória.
Em geral, existe uma maneira de fazer isso sem chamadas de função desperdiçadas ou memória? Você pode criar variáveis temporárias em uma lista de inicializadores? Obrigado.
-O3
. Mas, provavelmente, para qualquer implementação de teste simples, ele realmente alinharia a chamada de função. Se você usar __attribute__((const))
ou purificar o protótipo sem fornecer uma definição visível, ele deve permitir que o GCC ou o clang façam a eliminação da subexpressão comum (CSE) entre as duas chamadas com o mesmo argumento. Observe que a resposta de Drew funciona mesmo para funções não puras, por isso é muito melhor e você deve usá-la sempre que a função não estiver alinhada.