从另一个运算符重载函数调用运算符重载函数:performance

时间:2015-07-18 20:36:12

标签: c++ operator-overloading

我正在为学习目的制作一个分数课程。为了添加函数,我重载了+运算符。第一个采用一个分数作为第二个参数,第二个函数采用int作为第二个参数。虽然可以从另一个函数中调用其中一个函数,但这是一个关于性能的好习惯吗?

Fraction Fraction::operator+(const Fraction& r_oper) {                                                                   
    int l_lcm{Fberlanga::Math::lcm(this->denominator(),r_oper.denominator())};                                           
    Fraction fr(l_lcm*this->numerator() / this->denominator() + l_lcm*r_oper.numerator() / r_oper.denominator(),l_lcm);  
    fr.simplify();                                                                                                       
    return fr;                                                                                                           
}

Fraction Fraction::operator+(int r_oper) {                                                                               
    Fraction fr{r_oper,1}; // create fraction of the form r_oper / 1                                                                                               
    fr = (*this) + fr;  // call the other version that takes a fraction as 2nd parameter                                                                                              
    //fr.simplify(); no need, it simplifies when calls the other function                                                                                                       
    return fr;                                                                                                           
}

2 个答案:

答案 0 :(得分:2)

它绝对不是最佳的,但这种类型的代码结构是一种常见的做法,尽管我个人认为在这种情况下它不是一个好的决定。

关于表现:

重写可能看起来像:

Fraction Fraction::operator+(int r_oper) {
    Fraction fr(this->numerator() + this->denominator() * r_oper, this->denominator());
//    fr.simplify(); <-- Even this is redundant!!!
    return fr;
}

这是一个非常简单的逻辑,我非常怀疑任何编译器都可以优化掉所有相关部分。

缺点可能是如果你改变你的结构或逻辑,你不得不修改2个函数而不是1.但是,考虑到所涉及的复杂性(重写可能是一个非常简单的事情)我&#39;在这种情况下,请使用详细/优化版本。

P.S。如果您决定坚持使用您的版本,int版本可以返回(*this) + fr,而无需简单地分配;

答案 1 :(得分:0)

答案是:也许。

如果您正在使用编译器内联,那么它的概率也一样快。您可以通过在声明变量时声明类声明中的operator或在返回类型之前使用inline声明符来执行此操作:

class Fraction
{
    ....
    inline operator+(...);
    ....
};

注意,如果使用内联,则定义必须位于头文件中。

如果您正在使用链接(将该函数放在.cpp文件中),那么它就没有那么快,因为链接到函数会增加一点点开销。

无论使用哪种方式,仍然强烈建议在其他运算符内调用运算符,因为它更易读,更易维护,物理代码更少。