동일한 함수 호출을 기반으로 초기화 해야하는 두 개의 다른 상수 멤버 변수가있는 경우 함수를 두 번 호출하지 않고이를 수행하는 방법이 있습니까?
예를 들어 분자와 분모가 일정한 분수 클래스입니다.
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 함수가 두 번 호출되므로 시간이 낭비됩니다. 새 반원을 정의 할 수도 있습니다.gcd_a_b
하고 먼저 초기화 목록의 gcd 출력을 할당하면 메모리 낭비가 발생합니다.
일반적으로 함수 호출이나 메모리 낭비 없이이 작업을 수행하는 방법이 있습니까? 초기화 목록에 임시 변수를 만들 수 있습니까? 감사합니다.
-O3
. 그러나 아마도 간단한 테스트 구현의 경우 실제로 함수 호출을 인라인 할 것입니다. __attribute__((const))
가시적 인 정의를 제공하지 않고 프로토 타입 을 사용 하거나 순수하게 사용하는 경우 GCC 또는 clang이 동일한 인수를 사용하여 두 호출간에 공통 하위 식 제거 (CSE)를 수행하도록해야합니다. Drew의 대답은 순수하지 않은 함수에서도 작동하므로 훨씬 좋으며 func가 인라인되지 않을 때마다 사용해야합니다.