我阅读了 cppreference 页面以了解运算符重载 - “二元算术运算符”。我对一段代码中的注释感到困惑,该注释鼓励通过值而不是引用传递以进行编译器优化。我没有经验,所以我可能错过了一些信息,但据我所知,在可能的情况下,鼓励通过引用传递而不是通过值传递。
第一个例子:
class A {
public:
A& operator+=(A const& rhs) {
/*...*/
return *this;
}
friend A operator+(A lhs, A const& rhs) {
lhs += rhs;
return lhs;
}
};
在此代码中,指出在
lhs
中按值传递 operator+
有助于优化链式加法。据我了解,这与 SO 上的this答案形成鲜明对比,该答案指出按值传递会阻止“命名返回值优化”。
第二个例子:
inline A operator+(A const& lhs, X const& rhs) {
A a = lhs;
a += rhs;
return a;
}
第二个示例提供了
A a = lhs;
,根据 this 线程的接受答案进行了解释,如果 operator+
是根据 operator+=
实现的,则第一个示例的优化是正确的。
如果在没有
operator+
的情况下实现 operator+=
,第一个示例的优化是否正确?
如果第二个示例包括“命名返回值优化”,那么哪种实现对于计算效率来说是首选?
还有其他理由选择其中一种而不是另一种吗?
这个建议的本质是通常更喜欢按值传递参数,而不是在函数内部进行复制。原因是,仅当实际参数是左值时,按值传递才涉及复制,否则涉及移动。考虑:
Matrix a, b, c;
//...
Matrix d = a + b + c;
这里,
operator+()
将被调用两次,第二次使用临时对象a+b
。如果 operator+()
的第一个参数是按值传递的,那么第二次添加涉及移动而不是复制。
如果operator+是,第一个例子的优化是否成立 不使用运算符+= 实现? 不,因为在这种情况下,内部没有复制
。operator+()