2つの異なる定数メンバー変数があり、どちらも同じ関数呼び出しに基づいて初期化する必要がある場合、関数を2回呼び出さずにこれを行う方法はありますか?
たとえば、分子と分母が定数である分数クラス。
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;
};
これにより、GCD関数が2回呼び出されるため、時間が無駄になります。新しいクラスメンバーを定義し、gcd_a_b
最初にgcdの出力を初期化リストのそれに割り当てることもできますが、これによりメモリが無駄になります。
一般に、関数呼び出しやメモリを無駄にせずにこれを行う方法はありますか?初期化リストに一時変数を作成できますか?ありがとうございました。
-O3
ます。しかし、おそらく任意の単純なテスト実装では、実際には関数呼び出しがインライン化されます。__attribute__((const))
可視的な定義を提供せずにプロトタイプを使用するか純粋な場合、GCCまたはclangは、同じ引数を持つ2つの呼び出し間で共通部分式の除去(CSE)を実行できます。Drewの回答は純粋でない関数でも機能するため、はるかに優れており、funcがインライン化しない可能性がある場合はいつでも使用する必要があります。