3

我正在尝试为创建为的 Integer 类重载二进制 +:

const Integer operator+(const Integer& left,const Integer& right) 
{
    return Integer(left.i + right.i);
}

 const Integer operator+(const Integer& left,const Integer& right)
 {
     Integer tmp(left.i + right.i);
     return tmp;
 }

现在我学到的是,在第一种情况下,创建并返回一个临时 Integer 对象,在第二种情况下,通常使用构造函数调用创建对象,然后复制然后调用析构函数。Ecekl 所说的第一个是编译器通过将对象直接构建到外部返回值的位置来利用这一点。我们从中推断出什么?我阅读了有关返回值优化的信息,但无法通过直接复制到位置事物中来理解它的含义。

4

1 回答 1

7

绝对没有区别,在大多数情况下,体面的编译器会将第二种形式优化为第一种形式 - 并在返回时通过命名返回值优化 (NRVO)tmp执行复制/移动省略。

如果它使代码对您更易读,或者更易于维护和/或调试,您可能希望使用第二种形式。如果您关心性能,则没有理由(除非您关闭了编译器优化,但这表明您首先对性能不感兴趣)。

但是请注意,返回 aconst Integer没有多大意义。由于您是按值返回,因此您应该返回一个Integer

Integer operator + (const Integer& left, const Integer& right) 
{
    return Integer(left.i + right.i);
}

作为最后的评论,这甚至可以重写如下,前提是Integer有一个非explicit构造函数接受一个int(注意,这通常不是这种情况,因为接受一个参数的构造函数通常被标记为explicit避免尴尬的隐式转换):

Integer operator + (const Integer& left, const Integer& right) 
{
    return left.i + right.i;
}
于 2013-03-10T15:30:09.203 回答