Якщо у мене є дві різні змінні постійних членів, які обидві потрібно ініціалізувати на основі одного і того ж виклику функції, чи є спосіб зробити це без виклику функції двічі?
Наприклад, клас дробу, де чисельник і знаменник є постійними.
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) між двома дзвінками з однаковою arg. Зауважте, що відповідь Дрю працює навіть для нечистих функцій, тому це набагато краще, і ви повинні використовувати її будь-коли, коли функція може не вбудовуватися.