Если у меня есть две разные постоянные переменные-члены, которые нужно инициализировать на основе одного и того же вызова функции, есть ли способ сделать это, не вызывая функцию дважды?
Например, класс дроби, где числитель и знаменатель постоянны.
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) между двумя вызовами с одним и тем же аргументом. Обратите внимание, что ответ Дрю работает даже для не чистых функций, поэтому он намного лучше, и вы должны использовать его в любое время, когда функция может не быть встроенной.