返回对象的两种形式的区别是什么?

What is the difference between the two forms of returning object?

本文关键字:区别 是什么 对象 两种 返回      更新时间:2023-10-16

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

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所说的第一个是编译器通过将对象直接构建到外部返回值的位置来利用这一点。我们从中可以推断出什么?我读了关于返回值优化,但无法通过直接复制到位置的东西得到它的意思。

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

如果第二种形式使代码更易于阅读,或者更易于维护和/或调试,那么您可能希望使用第二种形式。如果您关心性能,没有理由(除非您关闭了编译器优化,但这将表明您首先对性能不感兴趣)。 但是,请注意,返回const Integer没有多大意义。因为你是按值返回的,你应该返回一个Integer:
Integer operator + (const Integer& left, const Integer& right) 
{
    return Integer(left.i + right.i);
}

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

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